现在,我正在使用Interlocked.CompareExchange
方法来检查我们是否在正确的线程上,以及是否有任何事件处理程序的订阅者。如果这两个条件均为真,则该事件将被触发。我使用以下代码执行此操作:
Interlocked.CompareExchange(ref MyEventHandler, null, null)?.Invoke(this, MyArguments);
这对我很有用。但是,这就是我想知道的。有没有办法重构这个语句,以便我可以返回一个布尔值,指示是否有MyEventHandler
的任何订阅者?
- 编辑 -
我还希望保持触发事件的相同功能(如果条件满足)以及能够知道处理程序是否有任何订阅者。
- 编辑2 -
我自己重读这篇文章,我觉得它的措辞可能会好一些。这是我想要做的:
答案 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);
我不会在这里看到任何需要更多比赛条件的比赛条件。