繁体   English   中英

C#eventhandler如何在内部工作?

[英]How does C# eventhandler work internally?

我猜C#eventhandler有一个监听器列表,它在发送消息时通过列表循环。 我的问题是这是如何在内部工作的。 它是否在循环之前制作列表的副本,如果是这样,如果有人在复制列表之后取消注册但尚未收到消息,会发生什么。

即使它已取消注册,它仍会得到消息吗?

委托是不可变的,因此当您调用委托时,已知并修复了订户列表。 订阅或取消订阅将替换支持事件的委托。

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

  1. 委托已经在被调用的过程中
  2. 为了调用,已经获得了委托的快照

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)

因此,如果您使用事件编写复杂的多线程代码,则应该进行防御性编码,以便您认为已取消订阅触发事件不是问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM