多线程环境中的事件调度安全
在多线程应用程序中使用事件时,确保线程安全至关重要,以避免潜在的竞争条件。事件分派的一种常见方法是在调用事件之前检查事件是否为空。然而,这提出了一个问题:
另一个线程可以在空检查和事件调用之间改变事件调用列表吗?
为了解决这个问题,一个更健壮的方法解决方案是使用以下模式:
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
此技术有效因为:
虽然此解决方案解决了空事件的情况,它不处理复制后事件处理程序或事件订阅失效的可能性。如需更全面的解决方案和进一步讨论,请参阅提供的外部资源。
此外,在 C# 6.0 中,Krzysztof 的解决方案(如答案中所述)提供了可行的替代方案。
以上是在多线程 .NET 应用程序中分派事件时会出现线程安全问题吗?的详细内容。更多信息请关注PHP中文网其他相关文章!