订阅相同事件的多个线程

问题描述:

当10个线程订阅同一事件并触发事件时会发生什么? 哪个线程会把它捡起来?订阅相同事件的多个线程

+1

你的意思是线程?线程如何订阅事件?我认为你的意思与众不同...... – Incognito 2010-08-13 19:16:20

+0

10线程执行订阅一个事件的相同方法。 – koumides 2010-08-13 19:19:33

+0

这个问题有点令人困惑,或者可能无法正确理解。如果事件是一个Windows事件(即,由CreateEvent创建)并且多个线程正在等待它发出信号,那么ScottTx的答案似乎是正确的。如果事件是应用程序框架的事件(类似于Delphi或C#OnClick事件的按钮),那么许多答案可能是正确的! (但是,如果多线程再次订阅一个应用程序事件?!!)。这个信息是为了让读者高兴,即使这是一个老问题。 – ssh 2011-09-28 18:40:13

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

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

+0

如果您想要更加异步的事件视图,可以查看[Rx](http://msdn.microsoft.com/zh-cn/devlabs/ee794896.aspx)。使用Rx,将事件封送到一个特定的线程是很容易的(当然,假设它有一个'SynchronizationContext'来封送)。 – 2010-08-13 19:22:51

+0

我想线程也是对象... :) – ultrajohn 2010-08-13 19:30:00

+0

@ultrajohn:booooo! :) – 2010-08-13 19:36:10

我想你在这里的意思是在不同的线程上的多个对象订阅一个事件。

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

你的问题的答案我猜是依赖于事件调度程序的实现......通常你使用一个列表来跟踪订阅特定事件的所有事件处理程序,所以最可能的方面是这种类型的实现,第一个被触发的处理程序是第一个获得订阅的事件处理程序,如果你当然要同步调用所有相关的程序,那么这取决于...只是一个想法..

如果你想要知道哪个对象将拾取事件,订阅事件的每个对象都会拾取该事件,但每个对象都将在事件发生的线程上运行。

如果您想知道哪个对象首先会看到该事件,请参阅ultrajohns回答。

我想如果我理解你的问题。你的意思是要求你的对象暴露你的对象的用户可以订阅的事件。如果你的对象有10个不同的用户订阅了这个事件,并且在某个时候你触发了这个事件,那么事件处理程序将被调用的顺序(或者同时)是什么?

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

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