2012-06-21 109 views
1

我對線程非常陌生,因此我不太確定這是否是一種競爭條件。我使用C#的SerialPort類查詢串行設備中的數據。我通過閱讀互聯網的理解是,當接收到數據的事件被激發時,這個類會產生一個單獨的線程。當程序不讓我設置事件方法中文本框的值時,這似乎得到了確認,因爲控件只能在創建它們的線程中設置。我的問題是,我認爲競爭條件存在於我設置文本框內容的方式中。修復C#競爭條件

使用這種方法

private void btnWidth_Click(object sender, EventArgs e) 
{ 
    mySerialManager.ClearErrorQueue(); 
    mySerialManager.WriteLine(); 
    Thread.Sleep(1000); 

    if (mySerialManager.HasErrors()) 
    { 
     MessageBox.Show("There was an Error Accessing the Serial Device:\n\r" + PrintAllErrors(mySerialManager), "Serial Device Error"); 
     return; 
    } 

    btnSubmit.Enabled = true; 
    btnSubmit.Select(); 
    txtMeasWidth.Text = myRecievedData.Substring(0, myRecievedData.Length - 1).Trim(); 
} 

我將數據寫入命令到串行設備,然後將文本框的內容。事件處理程序在觸發後設置myRecievedData字符串的值。我的問題是如何確保事件已被觸發,並在寫入文本框之前設置了該字符串的值。我在這個方法的底部做了一個快速修復,但我想確保如果這是一個競爭條件,它會被照顧。

對不起,這是如此漫長的囉嗦。先謝謝您的幫助!

+3

爲什麼這個downvoted?這是一個明確的問題。 –

回答

1

是的,你在這裏創造一個競爭狀態。
但它很容易修復。

在你ComPortDataReceivedEventHandler只是調用,將設置你的文本框與適當的文本

一種方法的例子:

form.Invoke(new MethodInvoker(delegate() {textMeasWidth.Text = myreceivedData})) 
2

你是正確的,有一個競爭條件。您可以使用Invoke方法來安全地從您的SerialPort的事件處理程序更新的文本框中:

txtMeasWidth.Invoke((Action)delegate { txtMeasWidth.Text = myRecievedData; }); 
+0

我嘗試過使用這個調用,但它並沒有做任何事情。是否有任何與調用相關的問題?我看到的一個區別是我使用表單調用而不是文本框。也許這是問題? – Pat

+0

不,調用窗體上的Invoke也應該起作用。當您嘗試它時,您傳遞給Invoke的委託從未實際調用過? –

+0

非常多,它只是完全忽略了這條線,如果我試圖通過代碼,調試器會凍結在那條線上。 – Pat