试图了解这是如何在UI线程上调用的

本文关键字:线程 UI 调用 了解 | 更新日期: 2023-09-27 18:29:15

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

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

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

然后进一步:

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

我不理解他的意思,你怎么能说这将在UI线程上调用,除非你指定了一个不是的动作,否则所有的动作都在UI线程中调用吗?(您可以指定哪个操作被称为btw,如果没有提供任何操作,则上面的一行就是)。

试图了解这是如何在UI线程上调用的

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

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

或者可以异步调用

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

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

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

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