Null チェックによるイベントディスパッチでのスレッドの安全性の確保
マルチスレッド環境で作業する場合、スレッドが干渉しないようにすることが重要です繊細な操作をしながらお互いに。このような操作の 1 つがイベント ディスパッチです。これには、イベント リスナーを呼び出す前に null のチェックが含まれる場合があります。
イベント ディスパッチの推奨アプローチには、次のような null のチェックが含まれます。
public event EventHandler SomeEvent; ... { .... if(SomeEvent!=null)SomeEvent(); }
ただし、マルチ-スレッド環境では、null チェックと実際のイベント呼び出しの間に別のスレッドが SomeEvent の呼び出しリストを変更するシナリオが発生する可能性があります。これにより、例外や予期しない動作が発生する可能性があります。
このスレッド セーフティの問題に対処するために、一般的に使用される手法は、null チェックを実行する前に SomeEvent マルチキャスト デリゲートのコピーを作成することです。これは、以下に示すように、保護された仮想メソッドを使用して行われます。
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
この手法により、コピーの作成後に SomeEvent に加えられた変更が、呼び出されているデリゲートのコピーに影響を与えないことが保証されます。
ただし、この解決策は null イベント ハンドラーの問題のみを解決するものであることに注意することが重要です。イベント ハンドラーが追加後に無効になった場合や、コピーが取得された後にイベント ハンドラーがサブスクライブした場合は処理されません。
イベント ディスパッチにおける競合状態を処理するためのより包括的なアプローチについては、Interlocked.CompareExchange の使用を検討してください。メソッドを使用したり、匿名デリゲートやスレッド同期プリミティブなどの C# 6.0 の機能を調べたりできます。
以上がNull チェックを使用してイベントをディスパッチするときにスレッドの安全性を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。