2014-03-27 70 views
0

請看看我的問題:C#Backgroundworker數據無效 - 線程問題?

我開發的邏輯會運行很長一段時間。在運行邏輯時,我想將狀態報告給進度條。大!所以我用後臺工作者:

_backgroundWorker = new BackgroundWorker(); 
_backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); 
_backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged); 
_backgroundWorker.WorkerReportsProgress = true; 
_backgroundWorker.RunWorkerAsync(); 

在backgroundWorker_Dowork,我有邏輯工作。我還聲明,被調用每50ms報告狀態計時器(內backgroundWorker_DoWork):

timer.Elapsed += (senderr, ee) => timer_Elapsed(); 
_timer.Interval = 50; 

內timer_Elapsed,我更新通過調用UI控件_backgroundWorker.ReportProgress(0);我在BackgroundWorker_DoWork內部不會調用ReportProgress的原因是因爲雖然我的代碼需要一段時間,但我用來完成我的工作的while循環非常快。如果我在while循環結束時調用ReportProgres,則會出現相同的非響應類型的UI問題。

現在我的問題是處理少量數據時,調用timer_Elapsed時,所有的變量和數據都是0和null。我似乎無法弄清楚爲什麼..我有多線程編程豐富的經驗,但C#掩蓋了一切,我不知道哪個線程有什麼數據...

然後定時器在backgroundWorker_DoWork內插入後長運行邏輯完成。

關於爲什麼這些數據無效的任何想法?任何暗示將不勝感激。

+0

DoWork調用的任何東西(包括事件觸發)在運行BackgroundWorker的線程上處理。你可以發佈你的代碼timer_Elapsed? – JNYRanger

回答

1

您不會顯示您的所有代碼,但我對您描述的理解是,timer.Elapsed在與您的後臺工作人員不同的線程上運行,因此您有競爭狀況。

此外,您關於「何時處理小數據」的評論讓我覺得您的timer.Elapsed在後臺工作者已經完成並且您沒有正確處理這種情況之後調用。

我建議你直接從後臺工作人員報告進度。只是不要這樣做迭代你的循環,只有1000(實際的數字應根據你的循環旋轉速度來選擇)。

0

你可以在while循環中做,但不是在每次迭代中。有兩個選項:

  1. 只有在每n 報告進度次迭代(比如每100 迭代)
  2. 保持一個時間戳,當在50ms的經過,報告狀態和更新時間戳