2015-04-01 51 views
-2

我想做以下事情:如何在不阻塞GUI的情況下執行後臺任務,但將信息傳回主線程?

  • 在GUI上有一個按鈕和一個表。
  • 當我按下按鈕,任務開始
  • 這個任務是一個while循環,讓我在每次迭代

我怎樣才能運行這個循環,並在它的每一次迭代中獲得的數據資料主GUI表,不阻塞GUI?這很重要,因爲while stop條件再次是GUI上的一個按鈕。

我試過使用BackgroundWorker,但我真的無法弄清楚如何在每次循環迭代時發回數據(???)我可以在最後得到結果,但那不是目標。如果我在一個循環中啓動worker(但在worker中沒有循環),它不起作用。

private void ContinuousCoordinateAquisition(object sender, DoWorkEventArgs e) 
{ 
    while (continuousPositionAquisitionFlag == true)      // while the monitoring is not stopped, get positions 
    { 
     // get xyzwpr world coordinates 
     robotCoordinatesXYZWPRworld XYZWPRworld = robi.getRobotPosition_xyzwpr_world(); 

     Do something........... retuns values I need in GUI 

     // sleep for defined time 
     System.Threading.Thread.Sleep(1000); // wait 
    } 
} 

主叫將是

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += new DoWorkEventHandler(ContinuousCoordinateAquisition); 
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ContinuousCoordinateAquisitionCompleted); 

continuousPositionAquisitionFlag從按鈕(停止鍵)來設置。 ContinuousCoordinateAquisitionCompleted這裏只做一次不幸的是,不是每一次迭代。

+0

_Reactive Extensions_是你的朋友 – MickyD 2015-04-01 13:28:55

+0

對BGW有ProgressChanged事件,完美將數據提交給主線程。 – 2015-04-01 13:34:51

+0

但是,如果每個循環暫停1000毫秒,您可能更適合使用計時器。 – 2015-04-01 13:35:59

回答

2

你在正確的軌道上。您應該使用後臺工作器,但不要等待RunWorkerCompletedEventHandler完成時發生。

相反,您的循環內部定期調用您的後臺工作人員的ReportProgress方法。這將觸發您可以在GUI線程中處理的ProgressChanged事件。

在這裏看到:https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.progresschanged(v=vs.110).aspx

+0

好的,所以我補充說: bw.ProgressChanged + =新ProgressChangedEventHandler(ContinuousCoordinateAquisitionStep); 和 private void ContinuousCoordinateAquisitionStep(object sender,ProgressChangedEventArgs e) { e。??? } 我該如何獲取值? e在這裏沒有Result字段..... – 2015-04-01 13:41:28

+0

在啓動worker之前,需要將WorkerReportsProgress屬性設置爲True,https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker。 workerreportsprogress(v = vs.110)的.aspx。在你的「做什麼」你應該手動調用ReportProgress方法與一個參數表(這是一個userstate參數,這是一個對象),有你想傳輸的數據。這會觸發你的ProgressChanged事件。 「e」也包含你的對象。看到這裏:https://msdn.microsoft.com/en-us/library/a3zbdb1t(v=vs.110)。aspx – Lucius 2015-04-01 13:53:08

+0

謝謝,那個工作:) – 2015-04-01 14:15:47

相關問題