首页 > 后端开发 > C++ > 在 C# 中分派事件时如何避免竞争条件?

在 C# 中分派事件时如何避免竞争条件?

Mary-Kate Olsen
发布: 2025-01-03 17:03:41
原创
197 人浏览过

How to Avoid Race Conditions When Dispatching Events in C#?

事件调度中的竞争条件

C# 中的事件通常使用以下代码进行调度:

public event EventHandler SomeEvent;
...
{
    ....
    if(SomeEvent!=null)SomeEvent();
}
登录后复制

然而,在多线程环境中,这种方法可能会导致竞争条件。下面是它的发生方式:

  1. 线程 1 检查 SomeEvent 是否不为 null。
  2. 线程 2 从 SomeEvent 中删除唯一已注册的委托。
  3. 线程 1 继续执行调用 SomeEvent,由于调用列表为空而导致异常。

解决此问题并发问题,最佳实践是在检查 null 之前将调用列表复制到临时变量:

protected virtual void OnSomeEvent(EventArgs args) 
{
    EventHandler ev = SomeEvent;
    if (ev != null) ev(this, args);
}
登录后复制

这种方法是线程安全的,因为:

  • Delegate.Combine和 Delegate.Remove 返回新的委托实例而不是修改现有的委托实例。
  • .NET 中对象引用的赋值是原子。
  • 事件访问器(添加/删除)是同步的。

通过复制调用列表,我们确保事件处理程序被调用,即使它们在复制后被删除被采取。但是,需要注意的是,此解决方案并不能解决已失效事件处理程序的潜在状态问题。

以上是在 C# 中分派事件时如何避免竞争条件?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板