多个线程订阅相同的事件

时间:2010-08-13 19:13:34

标签: c# events

当10个线程订阅同一个事件并且事件触发时会发生什么? 哪个线程会接受它?

6 个答案:

答案 0 :(得分:16)

线程不订阅事件,对象执行。当事件触发时,所有注册的处理程序都在同一个线程(引发事件的线程)上执行。没有内置工具可以在多个线程上触发事件。

如果需要,处理程序可以选择将事件信息转发到单独的线程,但这不是事件分派的内置机制的一部分。

答案 1 :(得分:3)

如果“event”是指Win32同步事件(这是我如何阅读问题),那么它取决于EventWaitHandle的创建方式。如果手动复位,事件将发出所有线程的信号,所有线程都会执行。如果其自动复位,将发信号并执行单个线程。可以选择等待事件的10个线程中的任何一个。

答案 2 :(得分:1)

我认为你的意思是在不同的线程上有多个对象订阅一个事件。

将调用所有处理程序,但是在调用该事件的同一线程上。

答案 3 :(得分:0)

我猜你的问题的答案取决于事件调度程序的实现...通常你使用一个列表来跟踪订阅特定事件的所有事件处理程序,所以最有可能就此而言一种实现,第一个被触发的处理程序是第一个被订阅的事件处理程序,如果你当然同步调用所有相关的程序,如果没有,那么它取决于...只是一个想法..

答案 4 :(得分:0)

如果您想知道哪个对象将获取事件,那么订阅事件的每个对象都将获取该事件,但每个对象都将在事件发生的线程上运行。

如果你想知道哪个对象会选择该事件,请先看看ultrajohns的答案。

答案 5 :(得分:0)

我想如果我理解你的问题。您的意思是要求您的对象公开您的对象的用户可以订阅的事件。如果对象的10个不同用户订阅了此事件,并且在某个时刻触发了事件,那么将调用事件处理程序的顺序(或同时)?

回答:由于事件处理程序执行发生在触发它的同一个线程上(在这种情况下,对象的处理线程)一次只能处理一个处理函数。订单无法保证(意味着不一定第一个订户将首先执行,最后一个订户将最后执行)。我希望这回答了你的问题。底线是全部10个处理程序将被调用,没有一个将并行。他们将陆续执行。我看到人们不小心下标两次保存事件,然后看到行动发生两次,并且很难弄清楚为什么有些事情会发生多次。