您的位置:首页 > 其它

线程间操作无效: 从不是创建控件“xx”的线程访问它。

2017-09-11 11:15 357 查看
用C#写串口通信的时候遇到一个问题,奇怪的是我并没有用线程。其中receive是存放接收数据的文本框。

我直接将接收到的数据存放到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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐