使用Dispatcher切换到UI线程的正确语法

TRS*_*TRS 1 .net c# wpf multithreading dispatcher

有什么区别

Dispatcher.CurrentDispatcher.Invoke(somemethod);
Run Code Online (Sandbox Code Playgroud)

Application.Current.Dispatcher.Invoke(somemethod);
Run Code Online (Sandbox Code Playgroud)

当我使用第一个方法时,某些方法的执行速度比第二个方法快.我使用秒表并测量经过的毫秒数.我使用此方法根据来自外部线程的一些数据更新一些UI控件.

Roh*_*ats 6

Dispatcher.CurrentDispatcher将获得您调用此方法的当前线程关联的调度程序.

然而,Application.Current.Dispatcher将获得与UI线程关联的调度程序(假设您的应用程序是从UI线程启动的).


本质上,如果您从后台线程调用委托并尝试从它更新UI组件说

textBlock.Text = "Test";
Run Code Online (Sandbox Code Playgroud)

第一种方法将失败,因为它将在后台线程调度程序上调用委托,并且只能从UI线程修改UI组件.

第二种方法将起作用,因为它将委托UI线程上的任务.


当我使用第一个方法时,某些方法的执行速度比第二个方法快.我使用秒表并测量经过的毫秒数.我使用此方法根据来自外部线程的一些数据更新一些UI控件.

如果第一种方法适合您,则根本不需要使用Dispatcher,因为这意味着您已经在UI线程上.

并且您需要发布样本数据以便观察时间,以便进行验证.