現在、私たちが正しいスレッドにいるかどうか、そしてイベントハンドラのサブスクライバがあるかどうかを確認するためにInterlocked.CompareExchange
メソッドを使用しています。これらの条件の両方が真である場合、イベントはオフになります。私は次のコードでこれを行います:ハンドラにサブスクライバがあるかどうかを原子的に把握する
Interlocked.CompareExchange(ref MyEventHandler, null, null)?.Invoke(this, MyArguments);
これは私にとって非常にうまく動作します。しかし、ここに私が知りたいと思うものがあります。この文をリファクタリングする方法はありますか?つまり、MyEventHandler
のサブスクライバが存在するかどうかを示すブール値を返すことができますか?
- 編集 - 私もは、任意の加入者がにあったかどうかを知ることができることと一緒にイベント(条件が満たされた場合)を発射するのと同じ機能を維持したいと思います
ハンドラ。
- 編集2 -
再読み込み自分自身を、これは、私はそれが少し良く文言ことができると思います。ここに私がやろうとしていることがあります:
- 私たちが正しいスレッドにいるかどうかを確認してください。
- サブスクライバを確認してください。
- 条件1と条件2が満たされた場合にイベントを起動します。
- の加入者があった場合はそこではない
nullがない場合、既存のコードがイベントハンドラを呼び出します。それがすべてです。なぜここでCompareExchangeを使用しているのか理解できません。これは非x86プラットフォームまたはWindows以外のプラットフォームでですか? – hoodaticus
https://codeblog.jonskeet.uk/2015/01/30/clean-event-handlers-invocation-with-c-6/ – Snoopy
@hoodaticusいいえ、いいえ! – Snoopy