如何在订阅者的线程上调用事件处理程序?

问题描述:

在我的C++/Qt应用程序,每当我想提出一个信号/事件,我只想做:如何在订阅者的线程上调用事件处理程序?

emit Event(); 

这就需要所有的处理程序Event()同一个线程订阅了此事件的对象上。

C#似乎没有提供类似的东西,那么我该怎么做?

我有一个类,姑且称之为EventRaiser,其中有一个SomethingHappened事件,并在需要时引发事件的方法:

class EventRaiser 
{ 
    public event EventHandler SomethingHappened; 

    void RaiseEvent() 
    { 
     var anyoneWhosInterested = SomethingHappened; 
     if (anyoneWhosInterested != null) 
     { 
      try { anyoneWhosInterested(this, new EventArgs()); } 
      catch { /* we don't care */ } 
     } 
    } 
} 

我的问题是RaiseEvent()将调用线程RaiseEvent()上了处理程序调用。但是我需要在订阅该事件的线程上调用处理程序。

我该怎么做?

我在.NET 2.0和Visual Studio 2012

+0

[类似问题](http://*.com/a/2459683/815938)之前曾经讨论过, – kennyzx 2014-10-12 12:44:07

一般这种想法,因为你不能随意中断在不同的线程中运行的代码是没有意义的,注入的事件。该架构会导致大量的随机破坏。

使订户处理同步和编组。他们知道他们正在运行什么线程,以及如何安全地将一个呼叫整理到它上面。

考虑在SomethingHappened.add处理程序中捕获当前SynchronizationContext,并将事件发送/张贴到SynchronizationContext。这仅适用于订阅线程具有有意义的上下文的情况。

+0

在Qt中这是经历了事件循环。稍后将信号发送到正确的线程。涉及的运行代码不会中断。我想答案是“不可能在C#中”? – 2014-10-12 12:59:52

+0

我不认为Qt会中断正在运行的线程。它可能排队消息或事件,但从不会中断运行代码。用C++比用C#更加不可能。 – usr 2014-10-12 13:05:11