我正在運行需要很長時間才能運行的後臺工作線程。C#:查詢線程狀態
實際功能存儲位置的文件夾結構,但我們可以採取在不同的線程中運行下面的僞代碼的一個例子 -
private int currentResult=0;
private void worker() {
for(int n = 0; n<1000; ++n)
{
int result;
// Do some time consuming computation and update the result
currentResult = result;
}
}
這在BackgroundWorker
線程中運行。我可以安全地從另一個線程讀取currentResult
嗎?
編輯:
關鍵字volatile
似乎是一個神奇的解決方案(感謝喬恩)!我打算通過一個string
以這種方式從工人類到UI的消息。
您可能想知道爲什麼我不使用ReportProgress
。原因是BackgroundWorker.DoWork
創建了一個不同類的對象,並調用了一個大量工作的方法。這種方法非常耗時。該類是獲得目錄結構的類,並且主要計算方法依賴於其中的許多相關方法。所以這個班級甚至不知道後臺工作人員的存在,因此無法向其報告進度。將該類的功能移動到BackgroundWorker
似乎很麻煩。如果這是一個糟糕的設計,我願意接受建議!
所以我需要的是「volatile int currentResult = 0;」? BackgroundWorker從自定義類('DirectoryStructure')中創建一些對象並在其中運行該方法。該方法是花費時間的。由於它是一個不同的類,我不能使用ReportProgress。一種選擇似乎是將DirectoryStructure類的功能轉移到包含BackgroundWorker的類中,但似乎很麻煩。我願意提供建議...... – KalEl 2010-07-07 17:40:27
@KalEl:僅僅因爲你在不同的課程中並不意味着你不能使用ReportProgress。例如,您可以通過DirectoryStructure委託在每次進度有所調用時調用該代理,並從該委託中調用ReportProgress。我真的不認爲共享訪問變量是在這裏溝通的好方法。 – 2010-07-07 17:48:47
謝謝,有道理。 – KalEl 2010-07-07 17:59:12