gpt4 book ai didi

c# - C# 事件处理程序在内部是如何工作的?

转载 作者:太空狗 更新时间:2023-10-30 00:56:14 25 4
gpt4 key购买 nike

我猜 C# 事件处理程序有一个监听器列表,它在发送消息时循环遍历列表。我的问题是这在内部是如何工作的。它是否在循环之前复制列表,如果是这样,如果有人在复制列表后注销自己但尚未收到消息,会发生什么情况。

即使它自己注销了,它还会收到消息吗?

最佳答案

委托(delegate)是不可变的,因此当您调用委托(delegate)时,订阅者列表是已知且固定的。订阅或取消订阅替换支持事件的委托(delegate)。

这确实意味着在多线程场景中您可以在取消订阅后收到一个事件,因为:

  1. 委托(delegate)已经在被调用的过程中
  2. 为了调用的目的
  3. 已经获得委托(delegate)的快照

2,我指的是通常的模式(以防止在调用期间出现 null-ref):

var handler = SomeEvent;
// <===== another thread could unsubscribe at this point
if(handler != null) handler(sender, args); // <== or part way through this invoke
// (and it either case, have the event trigger even though they think they have
// unsubscribed)

出于这个原因,如果您正在使用事件编写复杂的多线程代码,您应该进行防御性编码,以便在您认为您已取消订阅之后触发事件不是问题。

这些细微差别不会真正影响单线程代码。

关于c# - C# 事件处理程序在内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8209807/

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