.NET中的事件排序

时间:2013-09-03 22:16:27

标签: c# .net events

快速了解C#/ .NET中的事件排序问题。

假设您有一个读取套接字接口(TCP)的while循环。界面肯定是在处理排序(它是TCP)。假设您的数据包接口已写入,以便您在流中获得每个“数据包”,您将通过事件回调将其转发到下一个“层”或下一个对象。

所以这是伪代码:

while (1) {
    readsocket();
    if (data received = complete packet)
        raiseEvent(packet);
}

我的问题是:

  1. 事件是按顺序生成的吗? (即保留订购)
  2. 我假设#1是正确的,这意味着它会阻止while循环,直到事件完成处理?

1 个答案:

答案 0 :(得分:6)

您永远不知道该事件的实施方式。可能的是,事件将按顺序同步执行,并基于一些有意义的值。它们也可能以某种任意和不一致的顺序同步执行。它们甚至可能无法同步执行,并且各种事件处理程序将在新线程(或线程池线程)中执行。它完全取决于事件的实施来确定所有这些。

看到不同的事件处理程序并行执行(并且我的意思是非常非常罕见)并不常见,并且您遇到的几乎所有事件都将由单个多播委托支持,这意味着他们将被解雇的顺序是它们被添加的顺序,但你无法真正知道是否属于这种情况(禁止反编译代码)。公共API没有任何迹象表明它是如何实现的。

无论如何,从概念的角度来看,最好不要依赖事件处理程序调用的任何顺序,并且通常最好编程,好像各种事件处理程序可以同时运行一样,因为在概念层面,即使实施细节更具限制性,也就是事件所代表的内容。