C# 如何确定EventHandler的线程?

C# 如何确定EventHandler的线程?,c#,multithreading,events,event-handling,begininvoke,C#,Multithreading,Events,Event Handling,Begininvoke,我有一个事件,通常是异步引发的,如下所示: foreach (EventHandler eventHandler in Event.GetInvocationList()) { eventHandler.BeginInvoke(sender, e, EndRaiseEvent, eventHandler); } 现在也可能有监听器与引发事件的监听器位于同一个线程上,在这种情况下,我希望事件在不引发InVoke的情况下同步引发,但是如何区分调用列表中的监听器呢?您不需要这样做。其他侦听器在

我有一个事件,通常是异步引发的,如下所示:

foreach (EventHandler eventHandler in Event.GetInvocationList())
{
   eventHandler.BeginInvoke(sender, e, EndRaiseEvent, eventHandler);
}

现在也可能有监听器与引发事件的监听器位于同一个线程上,在这种情况下,我希望事件在不引发InVoke的情况下同步引发,但是如何区分调用列表中的监听器呢?

您不需要这样做。其他侦听器在不同线程上运行没有意义。当一个事件被引发时,如果你注册了它,那么不管它在哪个线程上引发,你都会被调用。

侦听器在不同的线程上这句话毫无意义。像这样使用BeginInvoke肯定不会让任何人快乐,这是没有意义的。如果某个线程是程序的UI线程,则只能希望该事件处理程序在该线程上运行。您可以使用Dispatcher.Invoke或Control.Invoke。和应该在事件处理程序本身中使用。@HansPassant BeginInvoke的原因是让我的类继续处理数据,而不会被慢速侦听器阻塞或死锁?NET中的对象是自由线程的,这就是@HansPassant声明语句侦听器位于不同线程上的原因。工作可以在单独的线程上完成,但对象不会绑定到线程,除非您正在使用COM对象。@KevinS引发事件的过程会锁定多个对象。对于在同一线程上运行的事件侦听器,这些锁没有问题,但是在另一线程上运行的事件侦听器“将永远无法处理事件,因为这些锁会导致死锁”。因此,尽管HansPassant在技术上是正确的,但我不知道如何更简单地解释它。听起来你应该让客户机注册一个界面,公开它是哪种类型的客户机,从而定制事件。这不是一个.NET事件,但我不认为您正在寻找的功能是内置的。UI控件公开了确定调用是否必要的能力,但事件没有。我知道这一点。我只是想避免为不需要它的事件侦听器启动。这不仅是为了节省性能,而且因为我调用BeginInvoke,所以当侦听器开始处理时,对象将是无锁的,对于在同一线程中运行的事件侦听器来说,这是不必要的。我并不真正理解无锁语句。您正在更新相互状态吗?我正在从一个函数引发事件,该函数锁定EventHandler可能需要访问的对象的c lock语句。