マルチスレッド環境でのイベント ディスパッチの安全性
マルチスレッド アプリケーションでイベントを使用する場合、スレッドの安全性を確保することが重要です。潜在的な競合状態。イベントをディスパッチする一般的なアプローチの 1 つは、イベントを呼び出す前にイベントが null かどうかをチェックすることです。ただし、これによって次のような疑問が生じます:
別のスレッドで null チェックとイベント呼び出しの間のイベント呼び出しリストを変更できますか?
この問題に対処するには、より堅牢な解決策は、次のパターンを使用することです:
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
このテクニックは機能しますなぜなら:
このソリューションは null イベントのシナリオに対処しますが、コピーが取得された後に機能しなくなったイベント ハンドラーやイベント サブスクリプションの可能性には対処しません。より包括的なソリューションと詳細な議論については、提供されている外部リソースを参照してください。
さらに、C# 6.0 では、回答で説明されているように、Krzysztof のソリューションが実行可能な代替手段を提供します。
以上がマルチスレッド .NET アプリケーションでイベントをディスパッチするときに、スレッド セーフティの問題が発生する可能性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。