執行緒間操作無效:從不是建立控制元件”txtContent”的執行緒訪問它
出現的問題:
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
{
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));
}));
}
本質上就是將需要重新整理主執行緒的程式碼放到子執行緒中,也就是用單獨一個執行緒來進行操作。