【发布时间】:2012-09-11 15:36:15
【问题描述】:
由于某种原因,我正在实现 BackgroundWorker 替换,并且我必须实现以下公共属性:
public bool CancellationPending { get; private set; }
public bool IsBusy { get; private set; }
public bool WorkerReportsProgress { get; set; }
public bool WorkerSupportsCancellation { get; set; }
我确定您知道它们在 BackgroundWorker 中的用途。因此它们可能会被不同的线程访问/修改。我担心如何“保护”它们以进行多线程处理。我认为将它们声明为 volatile 就足够了,但 volatile 不能应用于自动属性。
我该怎么办?我应该为这些属性创建私有字段,并声明它们volatile?还是应该在每个 get 和 set 块中使用 locking?
我认为这应该是非常常见的场景 - 使属性(最好是自动属性)线程安全。请注意,此示例中的所有属性都是原子类型。
编辑:
澄清我需要什么:我需要确保所有线程始终读取属性的最新值。看到这个:https://stackoverflow.com/a/10797326/1081467
同样,你建议使用volatile,或locking,或其他什么?.. 使用bool 属性时,原子性得到保证,所以只剩下第二个问题(阅读最新的-date 值),那么你如何正确解决这个问题?当你有非原始类型的属性时怎么办?您是否将locks 放在每个get 和set 块中?
【问题讨论】:
-
你不能使用
BackgroundWorker类? -
在每个
get和set块内使用locking。或者,使您的类型不可变。例如,CancellationPending不太可能有问题。 -
在这种情况下,
thread safe到底是什么意思? -
看来至少
IsBusy应该是一个事件,以便您可以等待它。也许其余的可以使用Interlocked.CompareExchange -
@TX_ 你为什么不用
Tasks 和STA scheduler 一起使用?
标签: c# .net multithreading thread-safety