试图了解如何在UI线程上调用它

时间:2012-03-27 21:42:54

标签: c# action eventaggregator

我正在通过不同的开源项目工作,以了解人们如何以不同的方式处理同一问题。这次是Event Aggregators,特别是Caliburn.Micro的一个。

我注意到Rob说如果没有提供EA将封送到UI线程的线程。该专线具体是:

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

然后继续:

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

我不明白他怎么能说这个会在UI线程上被调用,除非你指定一个不在线程上,否则在UI线程上调用所有动作? (您可以指定哪个动作称为btw,上面的行只是在没有提供动作的情况下)。

1 个答案:

答案 0 :(得分:1)

可以在调用它的线程中调用Action:

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

或者它可以异步调用

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

如果事件聚合器配置为使用同步调用,则可能在UI线程中处理事件。但是它不太可能,通常事件聚合器使用异步执行,并且操作在线程池中执行。

在有问题的代码中会有一个地方,它(在内部,不包括在这里)调用动作上的Invoke或BeginInvoke,这就是差异所在。

<子> N.B。此答案并非特定于任何特定事件聚合器。