Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中的事件排序_C#_.net_Events - Fatal编程技术网

C# NET中的事件排序

C# NET中的事件排序,c#,.net,events,C#,.net,Events,有一个关于C#/.NET中事件排序的快速问题 假设您有一个while循环,它读取套接字接口(TCP)。接口确实负责排序(它是TCP)。假设您编写了数据包接口,这样您在流中得到的每个“数据包”都将通过事件回调转发到下一个“层”或下一个对象 下面是伪代码: while (1) { readsocket(); if (data received = complete packet) raiseEvent(packet); } 我的问题是: 事件是否按顺序生成?(即保留

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

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

下面是伪代码:

while (1) {
    readsocket();
    if (data received = complete packet)
        raiseEvent(packet);
}
我的问题是:

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

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

    看到不同的事件处理程序并行执行是相当罕见的(我的意思是非常非常罕见),而且几乎所有遇到的事件都将由一个多播委托支持,这意味着它们的触发顺序是它们添加的顺序,但您无法确知是否如此(baring反编译代码)。公共API没有说明它是如何实现的


    不管所有这些,从概念的角度来看,最好不要依赖事件处理程序调用的任何顺序,并且通常最好像各种事件处理程序可以并发运行一样进行编程,因为在概念级别上,即使实现细节更具限制性,这也是事件所代表的.

    单线程?是。是,假设while(1)是唯一的循环,并且只有一个事件侦听器。raiseEvent也会执行硬阻塞(即阻止您读取另一个套接字数据)或者它本质上是为事件生成一个单独的线程。我猜它是一个硬块。不是答案,但是
    是将此循环与工作线程分离的一个很好的解决方案这将消耗它。Servy-让我们假设while循环是唯一调用事件的循环,并且只有一个事件侦听器。假设事件侦听器将其保存到数组中。在这种情况下,它是否符合顺序?(我假设这是因为我使用计数器进行了简单的测试)但更重要的是,它会在事件运行时阻止while循环吗?@Tony大多数事件的实现方式恰好都是这样。很难找到可以做其他事情的实现,但这是最有可能的,而且你无法知道是否是这样。它可能会工作,也可能不会,你知道没有办法知道。