在一個線程(線程2)中,我更改了一個值,例如在兩個線程之間保持布爾值同步
CheckSuccess = false;
現在主線程(線程1 - GUI /表)不皮卡的變化,會怎樣纔有可能「傳播完成」的轉變周圍的所有主題?
我是線程應該處理數據,在單獨的情況下無法正常工作(除非告知這樣做)
在一個線程(線程2)中,我更改了一個值,例如在兩個線程之間保持布爾值同步
CheckSuccess = false;
現在主線程(線程1 - GUI /表)不皮卡的變化,會怎樣纔有可能「傳播完成」的轉變周圍的所有主題?
我是線程應該處理數據,在單獨的情況下無法正常工作(除非告知這樣做)
這似乎是一個Race Condition的印象。爲了避免這種情況,您應該同步對共享變量的訪問。
volatile
關鍵字。如果CheckSuccess
是一個屬性(將被轉換成一個方法調用),可以使用lock() statement:
private static readonly object stateLock = new object();
lock (stateLock)
{
// access a shared variable here
CheckSuccess = false;
}
如果CheckSuccess
是UI控件的屬性,你想從一個工人線程改變它 - 您應該使用特殊技術將工作變更推送到UI線程,這取決於您使用的是WPF的WinForms框架。
PS: 此外,如果有多個線程讀取值和幾個線程寫入(基本上比寫讀更多)你可能會發現有用ReaderWriterLock
我沒有正式使用聯鎖方法,如Exchange。這比使用鎖定對象簡單得多,它保證是原子的。
問題很可能是編譯器優化導致在CPU寄存器中緩存布爾值。聲明它爲volatile
應該可以解決你的問題。
它被標記爲[volatile](http://msdn.microsoft.com/en-us/library/x13ttww7%28v=vs.71%29.aspx)? – oleksii 2011-12-17 13:26:02
主線程是否主動監視布爾值,或者變得知道已被更改? – Dykam 2011-12-17 13:33:06
背景工作者提供Completed和ProgressChanged事件來處理這個問題。 – 2011-12-17 13:35:44