2012-03-27 53 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.这个答案并不特定于任何特定的事件聚合器。