原子地确定处理程序是否有订阅者

时间:2016-07-15 17:59:16

标签: c# atomic

现在,我正在使用Interlocked.CompareExchange方法来检查我们是否在正确的线程上,以及是否有任何事件处理程序的订阅者。如果这两个条件均为真,则该事件将被触发。我使用以下代码执行此操作:

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

这对我很有用。但是,这就是我想知道的。有没有办法重构这个语句,以便我可以返回一个布尔值,指示是否有MyEventHandler的任何订阅者?

- 编辑 -

我还希望保持触发事件的相同功能(如果条件满足)以及能够知道处理程序是否有任何订阅者。

- 编辑2 -

我自己重读这篇文章,我觉得它的措辞可能会好一些。这是我想要做的:

  1. 检查我们是否在正确的主题上。
  2. 检查订阅者。
  3. 如果满足条件1和2,则触发事件。
  4. 如果有订阅者,则将布尔值指定为true;如果没有订阅者,则指定false,如果没有
  5. ,则指定false

1 个答案:

答案 0 :(得分: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);

我不会在这里看到任何需要更多比赛条件的比赛条件。