事件调度中的竞争条件
C# 中的事件通常使用以下代码进行调度:
public event EventHandler SomeEvent; ... { .... if(SomeEvent!=null)SomeEvent(); }
然而,在多线程环境中,这种方法可能会导致竞争条件。下面是它的发生方式:
解决此问题并发问题,最佳实践是在检查 null 之前将调用列表复制到临时变量:
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
这种方法是线程安全的,因为:
通过复制调用列表,我们确保事件处理程序被调用,即使它们在复制后被删除被采取。但是,需要注意的是,此解决方案并不能解决已失效事件处理程序的潜在状态问题。
以上是在 C# 中分派事件时如何避免竞争条件?的详细内容。更多信息请关注PHP中文网其他相关文章!