イベントディスパッチにおける競合状態
C# のイベントは、次のコードを使用してディスパッチされることがよくあります:
public event EventHandler SomeEvent; ... { .... if(SomeEvent!=null)SomeEvent(); }
ただし、マルチスレッド環境では、このアプローチは競合状態を引き起こす可能性があります。これがどのように起こるかは次のとおりです。
この同時実行性の問題に対処するためのベスト プラクティスは、null をチェックする前に呼び出しリストを一時変数にコピーすることです。
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
このアプローチはスレッドセーフです。なぜなら:
呼び出しをコピーすることにより、リストにあるように、コピーの取得後にイベント ハンドラーが削除された場合でも、イベント ハンドラーが確実に呼び出されます。ただし、この解決策は、廃止されたイベント ハンドラーに関する潜在的な状態の問題には対処していないことに注意することが重要です。
以上がC# でイベントをディスパッチするときに競合状態を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。