WPF的MVVM框架Stylet开发文档 10. 执行:调度到 UI 线程

10. 执行:调度到 UI 线程

原文地址

概括

Execute是一个小的静态助手,它可以更轻松地分派要在 UI 线程上运行的委托。它包装Application.Current.Dispatcher, 并提供方法使其更容易和更简洁地使用。

它还提供了一个辅助属性,Execute.InDesignMode. 当且仅当 Visual Studio 或 Expression Blend 设计器处于活动状态并且正在执行代码以提供用于设计时显示的虚拟数据时,才会出现这种情况。

下表给出了它提供的方法的高级摘要,后面给出了更深入的解释。

方法 尽可能内联 等待完成
Execute.OnUIThread
Execute.OnUIThreadSync ✔(块)
Execute.OnUIThreadAsync ✔(任务)
Execute.PostToUIThread
Execute.PostToUIThreadAsync ✔(任务)

**尽可能内联:**该方法将检查当前线程是否为 UI 线程。如果是,委托将同步运行。如果不是,则它将以某种形式分派到 UI 线程。

**等待完成:**要么阻塞直到委托完成执行,要么返回一个在委托完成执行时完成的任务。

详细

Execute.OnUIThread

检查当前线程是否是 UI thead。如果是,委托将同步运行。如果不是,委托将被分派到 UI 线程,以便在将来的某个时间点运行。在这种情况下,Execute.OnUIThread不会等待委托完成。

这反映了传统模式:

public static void InvokeIfRequired(Action action)
{
    if (Application.Current.Dispatcher.CheckAccess())
        action();
    else
        Application.Current.Dispatcher.BeginInvoke(action);
}

Execute.OnUIThreadSync

检查当前线程是否为 UI 线程。如果是,那么它将同步运行委托。如果不是,那么它将分派委托在 UI 线程上运行,并阻塞直到它完成执行。

因此,它与 非常相似Execute.OnUIThread,只是它只会在委托执行完毕后才返回。

Execute.OnUIThreadAsync

检查当前线程是否为 UI 线程。如果是,那么它将同步运行委托,并返回一个完成的任务。如果不是,那么它会在将来某个时候分派要在 UI 线程上运行的委托,并返回一个在委托完成执行时完成的任务。

因此,它实际上是Execute.OnUIThreadSync.

Execute.PostToUIThread

无论当前线程是否为 UI 线程,都会在将来的某个时刻发布要在 UI 线程上运行的委托。

Execute.PostToUIThreadAsync

无论当前线程是否为UI线程,都会在未来某个时刻将delegate发布到UI线程上运行,并返回一个Task,当delegate执行完毕后完成。

**请注意,**您绝不能做类似的事情Execute.PostToUIThreadAsync(() => something(foo)).Wait()。如果您从 UI 线程执行此操作,则会导致死锁。这种方法对方法没有意义Execute.PostXXX- 使用Execute.OnUIThreadSyncExecute.OnUIThreadAsync代替。

高级:单元测试

调度器

Execute实际上具有从Application.Current.Dispatcher. Execute.Dispatcher是类型的静态属性IDispatcher,用于Execute分派委托。此属性永远不能为 null,并且默认为IDispatcher同步执行所有内容的实现。然后它被重写BootstrapperBase为 . 的包装器Application.Current.Dispatcher

此行为意味着使用其中一种Execute方法的方法可以进行单元测试,或在设计时使用。在单元测试中,所有Execute方法都将同步运行它们的委托(因为 Dispatcher 不可用)。

如果需要,您还可以为单元测试设置Execute.Dispatcher自定义实现。IDispatcher

设计模式

Execute.InDesignMode也是可设置的,这将覆盖“实际”值。预计您几乎永远不需要实际执行此操作,但有时为了单元测试奇怪的小边缘情况(Stylet 中有几个这样的情况)它不可用。

项目原地址:https://github.com/canton7/Stylet
当前文档原地址:https://github.com/canton7/Stylet/wiki/Execute%3A-Dispatching-to-the-UI-thread

上一篇:WPF的MVVM框架Stylet开发文档 9. 属性变化推送基类PropertyChangedBase
下一篇:WPF的MVVM框架Stylet开发文档 11. Screens and Conductors

你可能感兴趣的:(MVVM,Stylet框架,ui,wpf,c#)