2010-07-07 142 views
2

我正在運行需要很長時間才能運行的後臺工作線程。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似乎很麻煩。如果這是一個糟糕的設計,我願意接受建議!

回答

6

如果你使它volatile你可以...或者如果你總是使用Interlocked類讀取和寫入它。 (或者總是在同一臺顯示器上的鎖上讀/寫)。如果沒有這些預防措施,最終可能會讀取陳舊的值。

但是,這並不一定是最好的辦法。一般來說,後臺工作人員應該使用ReportProgress來表明其進展情況......在這種情況下,您是否有任何理由不想這樣做?

+0

所以我需要的是「volatile int currentResult = 0;」? BackgroundWorker從自定義類('DirectoryStructure')中創建一些對象並在其中運行該方法。該方法是花費時間的。由於它是一個不同的類,我不能使用ReportProgress。一種選擇似乎是將DirectoryStructure類的功能轉移到包含BackgroundWorker的類中,但似乎很麻煩。我願意提供建議...... – KalEl 2010-07-07 17:40:27

+0

@KalEl:僅僅因爲你在不同的課程中並不意味着你不能使用ReportProgress。例如,您可以通過DirectoryStructure委託在每次進度有所調用時調用該代理,並從該委託中調用ReportProgress。我真的不認爲共享訪問變量是在這裏溝通的好方法。 – 2010-07-07 17:48:47

+0

謝謝,有道理。 – KalEl 2010-07-07 17:59:12