(注意:我已经问过这个问题,但答案是针对 Java 的,所以我对 C# 和 .NET 框架提出了同样的问题。它不是重复的。)
我使用这种模式已经有一段时间了,但直到最近我才开始认为这样做可能不太好。基本上,我使用这种模式的一些变体:
public class SampleAsync
{
public SampleAsync() { }
private bool completed;
public void Start()
{
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => {
//... do something on a different thread
completed = true;
};
worker.RunWorkerAsync();
}
public void Update()
{
if (!completed) return;
//... do something else
}
}
*用户有责任确保Start
只调用一次。Update
随时随地被调用。
我一直认为这在 C#/.NET 框架中是线程安全的,因为即使没有严格同步,我也只设置completed
为 true。一旦被观察到true
,它就不会重置为false
。它在构造函数中被初始化为 false,根据定义,它是线程安全的(除非你在其中做了一些愚蠢的事情)。那么,以这种方式使用不可重置标志是线程安全的吗?(如果是这样,它甚至会提供任何性能优势吗?)
谢谢