3

有一个关于 C#/.NET 中事件排序的快速问题。

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

所以这里是伪代码:

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

我的问题是:

  1. 事件是否按顺序生成?(即保留排序)
  2. 我假设 #1 是正确的,这意味着它将阻塞 while 循环,直到事件完成处理?
4

1 回答 1

6

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

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

无论如何,从概念的角度来看,最好不要依赖事件处理程序调用的任何顺序,并且通常最好将各种事件处理程序编程为可以同时运行,因为在概念级别,即即使实现细节更严格,事件代表什么。

于 2013-09-03T22:36:56.510 回答