解决:其他信息: 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。

大家好,我是刘士铭,今天尝试用C#开发一个简易的串口助手工具,遇到了以下的问题:

其他信息: 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。

在winform编程中常遇到此类问题,造成辅助线程无法给控件赋值

解决办法如下:

1.直接在窗体的构造函数中添加:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 

此时禁用了所有的控件合法性检查。

最简单的方法(不推荐):

为什么不推荐上面的方法:

为避免空间造成死锁, .net framework 2.0 之后 拒绝多线程访问空间, 以前Control.CheckForIllegalCrossThreadCalls 默认就是flase, 2.0后默认为true。当然如果能保证程序中不会好几个线程同时操作一个控件用上面的方法也可以, 如果存在多个线程一起操作控件使用下面的方法;

2.通过委托来解决

委托使用关键字 delegate 进行定义。

        private delegate void TextBoxAdd(string Str);
        //在给textBox1.text赋值的地方调用以下方法即可
        private void SetStr(string Str)
        {
            // InvokeRequired需要比较调用线程ID和创建线程ID
            // 如果它们不相同则返回true
            if (this.textBox1.InvokeRequired)
            {
                TextBoxAdd d = new TextBoxAdd(SetStr);
                this.Invoke(d, new object[] { Str });
            }
            else
            {
                textBox1.AppendText(Str + "");
            }
        }

下面是我在串口接收函数中的使用,测试发现问题解决,使用委托方法解决了问题,代码如下:

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if (radioButton3.Checked == true)
            {
                string Str = serialPort1.ReadExisting();
                SetStr(Str);
            }
            else 
            {
                int Lenth = serialPort1.BytesToRead;
                Byte[] Data = new Byte[Lenth];
                serialPort1.Read(Data,0,Lenth);
                for (int i = 0; i

 

你可能感兴趣的:(C#上位机)