gpt4 book ai didi

c# - 取消订阅处理程序中的事件总是安全的吗?

转载 作者:太空狗 更新时间:2023-10-29 18:26:39 25 4
gpt4 key购买 nike

假设我有这个(不完整的)类,在这个类中我引发了一个事件,但没有先将它分配给一个变量以使其成为线程安全的:

public class Test
{
public event EventHandler SomeEvent;

void OnSomeEvent(EventArgs e)
{
if (SomeEvent != null)
SomeEvent(this, e);
}
}

取消订阅事件处理程序本身是否安全,或者是否会出现类似于在枚举集合时从集合中删除项目时发生的问题?

void SomeEventHandler(object sender, EventArgs e)
{
testInstance.SomeEvent -= SomeEventHandler;
}

最佳答案

稍微澄清一下其他答案:

事件基于委托(delegate)(在几乎所有情况下)。代表是不可变的。这也适用于多播委托(delegate)。

当调用一个事件时,委托(delegate)被加载然后被调用。如果委托(delegate)存储的字段被修改,那么这不会影响已经加载的委托(delegate)。

因此从处理程序修改事件是安全的。这些更改不会影响当前正在运行的调用。这是有保证的。

所有这些仅适用于受委托(delegate)支持的事件。 C# 和 CLR 支持可以做任何事情的自定义事件。

关于c# - 取消订阅处理程序中的事件总是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32951450/

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