1. 程式人生 > >執行緒間操作無效:從不是建立控制元件”txtContent”的執行緒訪問它

執行緒間操作無效:從不是建立控制元件”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

 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));

                }));

        }

本質上就是將需要重新整理主執行緒的程式碼放到子執行緒中,也就是用單獨一個執行緒來進行操作。