2012-08-07 75 views
1

我有一個表格,加載時啓動一個循環後臺工作器,每半秒鐘從USB設備獲取數據。
一旦程序收到來自USB設備的新數據,它就會運行一個函數。
_Dowork函數具有從一個單獨的後臺工作人員更改表格

while (true) 
{ 
    portConnection.Write("?"); 
    Thread.Sleep(50); 
} 

我然後有當接收

private void portConnection_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
} 

該數據運行一個單獨的例程是無法在原來的形式上然後設定值作爲函數顯然是常規在一個單獨的線程。
我怎樣才能使這個例程能夠影響原始形式?

+4

看看'Invoke''''InvokeRequired' – 2012-08-07 08:52:44

+0

嘗試類似 if(portCon nection.InvokeRequired) { portConnection.Write(「?」); } – Rajesh 2012-08-07 08:59:08

回答

3

嘗試這樣:

private void InvokeIfRequired(Control target, Delegate methodToInvoke) 
{ 
    if (target.InvokeRequired) 
     target.Invoke(methodToInvoke); 
    else 
     methodToInvoke.DynamicInvoke(); 
} 

呼叫你ProcessStatsReceived並在methodToInvoke做你的東西的方法...

您可以在ProccessStatusReceived這樣使用它:

InvokeIfRequired(this, new MethodInvoker(delegate() { this.lblStatus.Text = (string)e.Data; })); 
+0

目標是我想要使用的主要形式還是單個對象? – 2012-08-07 09:15:30

+1

這是形式。我在回答中增加了一個例子 – Karl 2012-08-07 09:18:34

+0

完美地工作,因爲數據在被轉發到另一個函數之前進入一個函數我剛剛完成了上面的InvokeIfRequired(this,new MethodInvoker(delegate(){this.sensorLocationUpdated();})) ; – 2012-08-07 09:37:48

0

BackgroundWorker的報表進度部分就是爲此而做的。

這將使DoWork方法能夠在GUI線程上調用方法。

看到這msdn條細節。

總之,所需的配件有:

綁定的進步改變了處理程序:

bw.ProgressChanged += bw_ProgressChanged; 

設置BW允許進度報告:

bw.WorkerReportsProgress = true; 

實施進度變化的方法:

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    //your logic to be executed on the GUI thread here 
} 

然後調用它從DoWork的是這樣的:

bw.ReportProgress(progressPercentage, userState) 

progressPercentageuserState可以是用戶將數據從後臺線程轉移到ProgressChanged方法GUI線程上。