在一个线程(thread2)中,我更改了一个值,例如
CheckSuccess = false;
现在主线程(thread1 - GUI / Form)没有获取更改,如何“传播”所有线程周围的更改?
我的印象是线程应该操纵数据,而不是在单独的实例上工作(除非被告知这样做)
答案 0 :(得分:2)
好像是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
答案 1 :(得分:0)
我通常使用联锁方法,例如Exchange。这比使用锁定对象简单得多,并且保证是原子的。
答案 2 :(得分:0)
问题很可能是编译器优化导致在CPU寄存器中缓存布尔值。将其声明为volatile
可以解决您的问题。