2016-07-15 8 views
3

現在、私たちが正しいスレッドにいるかどうか、そしてイベントハンドラのサブスクライバがあるかどうかを確認するためにInterlocked.CompareExchangeメソッドを使用しています。これらの条件の両方が真である場合、イベントはオフになります。私は次のコードでこれを行います:ハンドラにサブスクライバがあるかどうかを原子的に把握する

Interlocked.CompareExchange(ref MyEventHandler, null, null)?.Invoke(this, MyArguments); 

これは私にとって非常にうまく動作します。しかし、ここに私が知りたいと思うものがあります。この文をリファクタリングする方法はありますか?つまり、MyEventHandlerのサブスクライバが存在するかどうかを示すブール値を返すことができますか?

- 編集 - 私もは、任意の加入者がにあったかどうかを知ることができることと一緒にイベント(条件が満たされた場合)を発射するのと同じ機能を維持したいと思います

ハンドラ。

- 編集2 -

再読み込み自分自身を、これは、私はそれが少し良く文言ことができると思います。ここに私がやろうとしていることがあります:

  1. 私たちが正しいスレッドにいるかどうかを確認してください。
  2. サブスクライバを確認してください。
  3. 条件1と条件2が満たされた場合にイベントを起動します。
  4. の加入者があった場合はそこではない
+0

nullがない場合、既存のコードがイベントハンドラを呼び出します。それがすべてです。なぜここでCompareExchangeを使用しているのか理解できません。これは非x86プラットフォームまたはWindows以外のプラットフォームでですか? – hoodaticus

+0

https://codeblog.jonskeet.uk/2015/01/30/clean-event-handlers-invocation-with-c-6/ – Snoopy

+0

@hoodaticusいいえ、いいえ! – Snoopy

答えて

2
var handler = Interlocked.CompareExchange(ref MyEventHandler, null, null); 
var hasSubscribersAndOnRightThread = handler != null && 
    handler.GetInvocationList().Any(h => h != null) && AmIOnTheRightThread(); 

if (hasSubscribersAndOnRightThread) handler.Invoke(this, MyArguments); 

た場合、私はそれ以上を必要とし、ここで任意の競合状態が表示されていない偽、真としてブール値を割り当てます。

+0

答えに感謝しますが、これはコメントに質問するとうまくいきます。 :) – Snoopy

+0

あなたの質問に答えるために、私の質問から何も欠けているものはありません。 – Snoopy

+0

@StevieV - 質問を削除するように編集 – hoodaticus

関連する問題