快速了解C#/ .NET中的事件排序问题。
假设您有一个读取套接字接口(TCP)的while循环。界面肯定是在处理排序(它是TCP)。假设您的数据包接口已写入,以便您在流中获得每个“数据包”,您将通过事件回调将其转发到下一个“层”或下一个对象。
所以这是伪代码:
while (1) {
readsocket();
if (data received = complete packet)
raiseEvent(packet);
}
我的问题是:
答案 0 :(得分:6)
您永远不知道该事件的实施方式。可能的是,事件将按顺序同步执行,并基于一些有意义的值。它们也可能以某种任意和不一致的顺序同步执行。它们甚至可能无法同步执行,并且各种事件处理程序将在新线程(或线程池线程)中执行。它完全取决于事件的实施来确定所有这些。
看到不同的事件处理程序并行执行(并且我的意思是非常非常罕见)并不常见,并且您遇到的几乎所有事件都将由单个多播委托支持,这意味着他们将被解雇的顺序是它们被添加的顺序,但你无法真正知道是否属于这种情况(禁止反编译代码)。公共API没有任何迹象表明它是如何实现的。
无论如何,从概念的角度来看,最好不要依赖事件处理程序调用的任何顺序,并且通常最好编程,好像各种事件处理程序可以同时运行一样,因为在概念层面,即使实施细节更具限制性,也就是事件所代表的内容。