2

我正在研究不同的开源项目,以了解人们如何以不同的方式处理同一个问题。这次是事件聚合器,特别是 Caliburn.Micro 的聚合器。

我注意到 Rob 说如果没有提供线程,EA 将编组到 UI 线程。该行具体是:

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

然后进一步:

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

我不明白他怎么能说这将在 UI 线程上调用,是否所有操作都在 UI 线程上调用,除非您指定一个不是?(顺便说一句,您可以指定调用哪个操作,上面的行只是在没有提供操作的情况下)。

4

1 回答 1

1

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

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

或者可以异步调用

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

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

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

注意这个答案并不特定于任何特定的事件聚合器。

于 2012-03-27T21:59:44.687 回答