C# NET中的事件排序
有一个关于C#/.NET中事件排序的快速问题 假设您有一个while循环,它读取套接字接口(TCP)。接口确实负责排序(它是TCP)。假设您编写了数据包接口,这样您在流中得到的每个“数据包”都将通过事件回调转发到下一个“层”或下一个对象 下面是伪代码:C# NET中的事件排序,c#,.net,events,C#,.net,Events,有一个关于C#/.NET中事件排序的快速问题 假设您有一个while循环,它读取套接字接口(TCP)。接口确实负责排序(它是TCP)。假设您编写了数据包接口,这样您在流中得到的每个“数据包”都将通过事件回调转发到下一个“层”或下一个对象 下面是伪代码: while (1) { readsocket(); if (data received = complete packet) raiseEvent(packet); } 我的问题是: 事件是否按顺序生成?(即保留
while (1) {
readsocket();
if (data received = complete packet)
raiseEvent(packet);
}
我的问题是:
您永远不知道事件是如何实现的。有可能所有事件都会同步地、有序地执行,并基于一些有意义的值。它们也有可能以任意和不一致的顺序同步执行。它们甚至可能不会同步执行,并且各种事件处理程序将在新线程(或线程池线程)中执行。这一切完全取决于活动的实施 看到不同的事件处理程序并行执行是相当罕见的(我的意思是非常非常罕见),而且几乎所有遇到的事件都将由一个多播委托支持,这意味着它们的触发顺序是它们添加的顺序,但您无法确知是否如此(baring反编译代码)。公共API没有说明它是如何实现的
不管所有这些,从概念的角度来看,最好不要依赖事件处理程序调用的任何顺序,并且通常最好像各种事件处理程序可以并发运行一样进行编程,因为在概念级别上,即使实现细节更具限制性,这也是事件所代表的.单线程?是。是,假设while(1)是唯一的循环,并且只有一个事件侦听器。raiseEvent也会执行硬阻塞(即阻止您读取另一个套接字数据)或者它本质上是为事件生成一个单独的线程。我猜它是一个硬块。不是答案,但是
是将此循环与工作线程分离的一个很好的解决方案这将消耗它。Servy-让我们假设while循环是唯一调用事件的循环,并且只有一个事件侦听器。假设事件侦听器将其保存到数组中。在这种情况下,它是否符合顺序?(我假设这是因为我使用计数器进行了简单的测试)但更重要的是,它会在事件运行时阻止while循环吗?@Tony大多数事件的实现方式恰好都是这样。很难找到可以做其他事情的实现,但这是最有可能的,而且你无法知道是否是这样。它可能会工作,也可能不会,你知道没有办法知道。