出现的问题:
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] readBuffer = new byte[seriaReceive.ReadBufferSize];
seriaReceive.Read(readBuffer, 0, readBuffer.Length);
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
data11 = readBuffer;
UpdateTextBox(ByteArrayToHexString(data11));
}
出现的问题主要就是我们在UI线程创建的子线程操作UI控件,访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。此时系统就会报出此错误信息。
==>解决办法
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] readBuffer = new byte[seriaReceive.ReadBufferSize];
seriaReceive.Read(readBuffer, 0, readBuffer.Length);
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
data11 = readBuffer;
new Thread(Check).Start();
}
public void Check()
{
lock (this)
Invoke(new MethodInvoker(delegate ()
{
UpdateTextBox(ByteArrayToHexString(data11));
}));
}
本质上就是将需要刷新主线程的代码放到子线程中,也就是用单独一个线程来进行操作。