マルチスレッド環境におけるイベント ディスパッチの安全性
マルチスレッド環境では、イベント ディスパッチの推奨されるアプローチには、呼び出し前にイベントが無効であるかどうかをチェックすることが含まれます。ただし、これにより、別のスレッドが null チェックとイベント呼び出しの間の呼び出しリストを変更する潜在的な競合状態に関する懸念が生じます。
この懸念に対処するために、提案される解決策には、イベント用の保護された仮想メソッドを作成することが含まれます。以下に示すように:
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
このメソッドは、イベントからマルチキャスト デリゲートを一時変数にコピーすることで、スレッドの安全性を確保します。その後イベントに変更を加えても、コピーされたデリゲートには影響しないため、安全なテストと呼び出しが可能になります。
ただし、この解決策は null イベントに関連する競合状態のみに対処します。イベント ハンドラーが無効な状態を参照したり、コピーの作成後にサブスクライブしたりする状況は処理されません。イベントの同時実行性の問題に対する包括的な解決策については、Eric Lippert のブログ投稿や参照されている StackOverflow の質問などの外部リソースを確認することをお勧めします。
C# 6.0 環境では、Krzysztof のアプローチを使用すると、イベント ディスパッチの安全性をさらに強化できます。
以上がマルチスレッド C# アプリケーションでイベントをディスパッチするときにスレッドの安全性を確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。