2012-03-27 27 views
2

我工作的方式是通過不同的開源項目來了解人們如何以不同方式處理相同問題。這一次它是Event Aggregators,特別是Caliburn.Micro的一個。試圖瞭解如何在UI上調用線程

我注意到羅布說,如果沒有線程提供EA將編組到UI線程。該生產線具體爲:

public static Action<System.Action> 
DefaultPublicationThreadMarshaller = action => action(); 

再往上:

marshal(() => 
     { 
      *SNIP* 
     }); 

我不明白他怎麼能說這將在UI線程上的幫助,將呼籲所有行動UI線程,除非你指定一個不是? (你可以指定哪個動作叫做btw,上面的行就是沒有提供動作的情況)。

+0

沒有什麼會導致它在UI線程上被調用。 'DefaultPublicationThreadMarshaller'只是調用當前正在運行的線程中的動作。你在哪裏找到完全提到的UI線程? – Groo 2012-03-27 21:48:40

+0

沒有這種自動行爲。也許這就是'marshal()'的設計和實現。 – 2012-03-27 21:51:15

回答

1

動作可以調用無論是在調用它的線程:

Action a =() => Foo(); 
a.Invoke(); 

如果事件聚合器配置爲使用同步調用那麼它可以異步

Action a =() => Foo(); 
a.BeginInvoke(); 

調用事件可能在UI線程中被處理。然而,這是不太可能的,通常事件聚合器使用異步執行,並且該操作在線程池中執行。

在有問題的代碼中會有一個地方,在這裏(內部而不是包含在這裏)調用Invoke或BeginInvoke這個動作,這就是差異所在。

N.B.這個答案並不特定於任何特定的事件聚合器。

相關問題