2012-04-02 29 views
0

我有DataReceviedHandler,即從Rx終端讀取數據。 我想在Rx(從DataReceviedHandler)獲取數據後更改radioButton的狀態,但我得到此錯誤:「跨線程操作無效:控制'radioButton3'從線程以外的線程訪問它創建於「。 我該怎麼做才能解決?c#2事件處理程序控制相同的單選按鈕

感謝, 奧茲

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     m_ser.GetType(); 
     m_ser.PortName = "COM28"; 
     m_ser.BaudRate = 115200; 
     m_ser.Open(); 
     m_ser.ReadTimeout = 500; 
     m_ser.WriteTimeout = 500; 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    public void DataReceviedHandler(object sender, SerialDataReceivedEventArgs e) 
    { 
     byte[] m_rxUSBbuff = new byte[500]; 
     SerialPort sptemp = (SerialPort)sender; 
     UInt16 rxbuffLength = (UInt16)m_ser.BytesToRead; 
     byte[] rxBuff = new byte[rxbuffLength]; 
     try 
     { 
      rxbuffLength = (UInt16)sptemp.Read(rxBuff, 0, sptemp.BytesToRead); 
     } 
     catch (System.IO.IOException) 
     { 
      Console.WriteLine("Faild to Read from serial InputBuffer"); 
      return; 
     } 
     int i; 
     int m_rxUSBLstMsgLength; 
     m_rxUSBLstMsgLength = (UInt16)rxbuffLength; 
     for (i = 0; i < m_rxUSBLstMsgLength; i++) 
     { 
      m_rxUSBbuff[i] = rxBuff[i]; 
     } 
     switch (m_rxUSBbuff[0]) 
     { 
      case 1: 
       radioButton1.Checked = true; 
       break; 
      case 2: 
       radioButton2.Checked = true; 
       break; 
      case 4: 
       radioButton3.Checked = true; 
       break; 
      case 8: 
       radioButton4.Checked = true; 
       break; 
      case 16: 
       radioButton5.Checked = true; 
       break; 
      default: 
       break; 
     } 


    } 

    private void CheckLeds_Click(object sender, EventArgs e) 
    { 
      byte[] txb = new byte[1] { 0xf2 }; 
      m_ser.Write(txb, 0, 1); 
    } 


} 
+1

從你所描述的你似乎有多個線程 - 請顯示相關的源代碼... – Yahia 2012-04-02 09:15:01

回答

1

數據到達時在後臺線程,並且也是該事件處理程序被調用。您不允許從除創建它們之外的線程(UI線程)修改UI元素。如果你爲此搜索stackoverflow,那麼你會發現如何做到這一點的答案堆。在Winforms中,您需要使用InvokeRequired,而在WPF中,您需要調用UI調度程序。

人在這個問題的答案包含了一大堆的鏈接,類似的問題:Cross-thread operation not valid

+0

謝謝,其工作 – 2012-04-02 09:54:42

0

正如克里斯說,元帥事件到UI線程,見here。此外,如果任何資源可能同時訪問我的多個線程,則將該資源置於互斥量下,請參閱here

相關問題