线程间操作无效: 从不是创建控件“xx”的线程访问它。
2017-09-11 11:15
357 查看
用C#写串口通信的时候遇到一个问题,奇怪的是我并没有用线程。其中receive是存放接收数据的文本框。
我直接将接收到的数据存放到receive这个文本框里,然后就报出了这个错误。
网上查过之后,知道是跨线程调用控件的问题。
解决方法:
1.线程开始的时候加一行代码:
Control.CheckForIllegalCrossThreadCalls = false;
这个方法比较简单,但是只是将错误提示禁用了,但跨线程调用控件的问题并没有解决。
2.使用委托,判断一下控件的InvokeRequired的属性,如果是true的话,进行invoke操作。
因为Invoke方法是同步的方法,所以执行的时候有先后顺序,因此就不会因为跨线程调用控件引起异常,所以推荐使用第二种方法。
参考:http://blog.csdn.net/chidy/article/details/9749341
我直接将接收到的数据存放到receive这个文本框里,然后就报出了这个错误。
private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] ReDatas = new byte[comDevice.BytesToRead]; comDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据 this.receive.Text = System.Text.Encoding.Default.GetString(ReDatas); }
网上查过之后,知道是跨线程调用控件的问题。
解决方法:
1.线程开始的时候加一行代码:
Control.CheckForIllegalCrossThreadCalls = false;
这个方法比较简单,但是只是将错误提示禁用了,但跨线程调用控件的问题并没有解决。
2.使用委托,判断一下控件的InvokeRequired的属性,如果是true的话,进行invoke操作。
private delegate void ShowDelegate(string strshow); public void Show(string strshow) { if (this.receive.InvokeRequired) { // this.txtreceive.BeginInvoke(new ShowDelegate(Show), strshow);//这个也可以 this.receive.Invoke(new ShowDelegate(Show), strshow); } else { this.receive.Text += strshow; } }
因为Invoke方法是同步的方法,所以执行的时候有先后顺序,因此就不会因为跨线程调用控件引起异常,所以推荐使用第二种方法。
参考:http://blog.csdn.net/chidy/article/details/9749341
相关文章推荐
- 线程间操作无效:从不是创建控件“XX”的线程访问它
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- 线程间操作无效:从不是创建控件“XX”的线程访问它
- bug:C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- 关于线程间操作无效: 从不是创建控件“xx”的线程访问它,错误解决方法
- 【转】C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- 线程间操作无效:从不是创建控件“XX”的线程访问它,多线程问题
- 线程间操作无效:从不是创建控件“XX”的线程访问它
- 线程间操作无效: 从不是创建控件" XX" 的线程访问它
- 线程间操作无效:从不是创建控件“XX”的线程访问它
- 从.NET 1.1 升级到.NET 4.0 遇到 线程间操作无效: 从不是创建控件 [XX] 的线程访问它.
- “线程间操作无效:从不是创建控件“XX”的线程访问它”的解决方法
- C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
- 线程间操作无效: 从不是创建控件的线程访问它.
- 线程间操作无效: 从不是创建控件“label1”的线程访问它。
- 线程间操作无效: 从不是创建控件“t1”的线程访问它
- 线程间操作无效: 从不是创建控件“...”的线程访问它
- 教你如何解决“线程间操作无效: 从不是创建控件的线程访问它”