2013-06-04 11 views
1

我有多個串口設備連接到我的電腦和我工作的一個程序,允許用戶選擇儘可能多的,因爲他們想要的端口,然後程序會動態創建TabPage,並增加了他們到TabControl跨線程出現InvalidOperationException試圖訪問的SerialPort動態

每個標籤頁也將有一個多TextBox,將顯示來自指定的SerialPort輸入數據到它。

這裏是我的代碼,試圖動態創建這些控件:

private void AddSerialPort(string portName) 
{ 
    ActiveSerialPorts.Add(portName); 

    if (!tabControlActiveSerialPorts.Enabled) 
     tabControlActiveSerialPorts.Enabled = true; 

    var page = new TabPage(portName); 

    page.Text = portName; 

    var tb = new TextBox(); 
    tb.Name = portName; 
    tb.Dock = DockStyle.Fill; 
    tb.BackColor = Color.Black; 
    tb.Multiline = true; 
    page.Controls.Add(tb); 
    tabControlActiveSerialPorts.TabPages.Add(page); 


    var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One); 
    sp.Open(); 
    tb.Tag = sp; 
    sp.DataReceived += delegate 
         { 
          tb.Text += sp.ReadExisting(); //LINE 87 
         }; 
} 

問題: 這是我得到的運行時錯誤,並在線突破土地87(以上評論代碼):

Cross-thread operation not valid: Control 'COM16' accessed from a thread other than the thread it was created on. 

這裏有什麼可能的缺陷?

回答

1

您正在接收後臺線程數據並嘗試從非UI線程更新UI。您需要將來自後臺線程的數據封送到UI線程以更新控件。這可以使用Control.Invoke方法完成。

sp.DataReceived += delegate 
    { 
     if (tb.InvokeRequired) 
     { 
      tb.Invoke(new Action(() => 
      { 
       tb.Text += sp.ReadExisting(); 
      })); 
     } 
     else 
     { 
      tb.Text += sp.ReadExisting(); 
     } 
    } 
+0

你只是真棒! –

+0

謝謝,高興幫忙:) – keyboardP