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