我正在通过不同的开源项目工作,以了解人们如何以不同的方式处理同一问题。这次是Event Aggregators,特别是Caliburn.Micro的一个。
我注意到Rob说如果没有提供EA将封送到UI线程的线程。该专线具体是:
public static Action<System.Action>
DefaultPublicationThreadMarshaller = action => action();
然后继续:
marshal(() =>
{
*SNIP*
});
我不明白他怎么能说这个会在UI线程上被调用,除非你指定一个不在线程上,否则在UI线程上调用所有动作? (您可以指定哪个动作称为btw,上面的行只是在没有提供动作的情况下)。
答案 0 :(得分:1)
可以在调用它的线程中调用Action:
Action a = () => Foo();
a.Invoke();
或者它可以异步调用
Action a = () => Foo();
a.BeginInvoke();
如果事件聚合器配置为使用同步调用,则可能在UI线程中处理事件。但是它不太可能,通常事件聚合器使用异步执行,并且操作在线程池中执行。
在有问题的代码中会有一个地方,它(在内部,不包括在这里)调用动作上的Invoke或BeginInvoke,这就是差异所在。
<子> N.B。此答案并非特定于任何特定事件聚合器。