2013-09-26 40 views
1

我有兩個非UI線程。非UI線程之間的事件

  • 線程A
  • 線程B

線程A引發事件和線程B監聽此事件。當線程B事件監聽器被執行時,它在線程A上執行(我想,因爲線程A引發了事件)。

我想要做的是,能夠在線程A引發一個事件,如果線程B正在監聽,監聽器應該得到的主題B.

事情是這樣執行的:

private void SomeMethodOnThreadA() 
    { 
     synchronizationContextOfThreadB.Send(new SendOrPostCallback(o => 
        { 
         EventXy(this, new EventArgs()); 
        }), null); 
    } 

但這是行不通的,因爲我是我的線程是非UI線程。

+1

線程B「聆聽」是如何進行的? –

+0

@ScottChamberlain線程B正在監聽一個事件,該事件從線程A中提取 – Snowcrack

+0

@AararrByrd事件是一個委託。 – Gusdor

回答

3

線程B沒有收聽事件。它可能是添加事件處理程序的線程,但該線程不是正在監聽的線程。

你不能隨時去,並告訴當前正在運行的線程去執行一些其他的方法,而不是它正在做什麼。當你開始一個新的線程時,你給它一個啓動的地方,它只是在那裏執行代碼,直到完成爲止,就這些了。

當你在UI線程上運行代碼時,你可以這樣做,因爲UI線程有一個消息循環。它代表一個隊列,該線程運行的代碼看起來是這樣的:

while(!applicationStopped) 
{ 
    Action nextAction = queue.Dequeue(); 
    nextAction(); 
} 

雖然有更多的有點(錯誤處理,例如)是一般的想法。要「在UI線程中運行代碼」,您只需將一個委託添加到隊列中,並且它最終將在UI線程中運行。

如果您想要在線程B中運行代碼,您需要一些類似的機制。您需要有某種委託,隊列或其他介質來提供它應該執行的委託,並且該線程需要爲應該運行的代表檢查該位置。在一般情況下,這通常是不可行的,除非這個其他線程類似於UI線程,因爲它不執行任何操作,而是執行從其他位置給出的委託。

0

線程不負責接收事件。這是調用事件處理程序的線程。

你可以有兩種方式:

1)使用像一個消息隊列。線程隊列的對象爲隊列(數據對象/操作),線程B嘗試處理隊列中的項目。 (火和遺忘)所以線程B必須監視隊列。

2)您可以在該線程上創建一個調度程序,並在其上調用Action。 (我在這裏做了一個簡單的DispatcherThread類:http://csharp.vanlangen.biz/threading/dispatcherthread/)它將創建一個帶有分派器的線程,以便您可以調用它的操作。