gpt4 book ai didi

c# - 在多线程环境中引发事件

转载 作者:行者123 更新时间:2023-11-30 12:29:27 25 4
gpt4 key购买 nike

<分区>

自 .NET 4.0 以来,自动生成的添加/删除事件处理程序是线程安全的(herehere)。因此,将监听器注册到公开事件的客户端可以从多个线程同时执行此操作,而不会发生竞争。

但是如果我想以线程安全的方式触发事件怎么办?推荐的做法似乎如下( here ):

public event EventHandler MyEvent;
protected void OnMyEvent(EventArgs e)
{
EventHandler myEvent = MyEvent;
if (myEvent != null)
{
myEvent(this, e);
}
}

但是,在阅读了一些有关 .NET 内存模型的内容后(例如 MSDN 杂志 2012-122013-01),我不再认为这是正确的。我担心的是编译器可能会引入内存读取,因此上面的代码可能会被 JIT-ted 成这样:

public event EventHandler MyEvent;
protected void OnMyEvent(EventArgs e)
{
// JIT removed the local variable and introduced two memory reads instead.
if (MyEvent != null)
{
// A race condition may cause the following line to throw a NullReferenceException.
MyEvent(this, e);
}
}

删除局部变量并使用重复的内存读取是合法的,因为如果在单线程环境中执行,它不会改变方法的行为。这是 ECMA 规范 ( ECMA-335: I.12.6.4 )。 2013-01 中还提供了易于理解的示例MSDN 杂志的问题。

我是不是漏掉了什么?如果没有,请提出解决方法。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com