2014-10-12 73 views
1

在我的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://stackoverflow.com/a/2459683/815938)之前曾經討論過, – kennyzx 2014-10-12 12:44:07

回答

1

一般這種想法,因爲你不能隨意中斷在不同的線程中運行的代碼是沒有意義的,注入的事件。該架構會導致大量的隨機破壞。

使訂戶處理同步和編組。他們知道他們正在運行什麼線程,以及如何安全地將一個呼叫整理到它上面。

考慮在SomethingHappened.add處理程序中捕獲當前SynchronizationContext,並將事件發送/張貼到SynchronizationContext。這僅適用於訂閱線程具有有意義的上下文的情況。

+0

在Qt中這是經歷了事件循環。稍後將信號發送到正確的線程。涉及的運行代碼不會中斷。我想答案是「不可能在C#中」? – 2014-10-12 12:59:52

+0

我不認爲Qt會中斷正在運行的線程。它可能排隊消息或事件,但從不會中斷運行代碼。用C++比用C#更加不可能。 – usr 2014-10-12 13:05:11

相關問題