多线程环境中的事件调度安全
在多线程环境中,推荐的事件调度方法包括在调用之前检查事件无效性。然而,这引起了对潜在竞争条件的担忧,即另一个线程修改空检查和事件调用之间的调用列表。
为了解决这个问题,建议的解决方案包括为事件创建一个受保护的虚拟方法,如下所示:
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
此方法通过将多播委托从事件复制到临时变量来确保线程安全。对事件的任何后续更改都不会影响复制的委托,从而允许安全测试和调用。
但是,此解决方案仅解决与空事件相关的竞争条件。它不处理事件处理程序引用无效状态或在复制后进行订阅的情况。对于事件并发问题的全面解决方案,建议查看外部资源,例如 Eric Lippert 的博文和引用的 StackOverflow 问题。
在 C# 6.0 环境中,使用 Krzysztof 的方法可以进一步增强事件调度的安全性。
以上是在多线程 C# 应用程序中调度事件时如何确保线程安全?的详细内容。更多信息请关注PHP中文网其他相关文章!