(注:私はすでにこの質問をしましたが、答えは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 に初期化されます。これは、定義上、スレッドセーフです (何か愚かなことをしない限り)。では、このようにリセット不可能なフラグを使用することはスレッドセーフですか? (もしそうなら、それはパフォーマンス上の利点さえ提供しますか?)
ありがとう