Task.Factory.StartNew and Application.Current.Dispatcher.Inv

本文关键字:Current Dispatcher Inv Application and Factory StartNew Task | 更新日期: 2023-09-27 18:09:43

给定以下代码:

Task.Factory.StartNew(() =>
{
    Application.Current.Dispatcher.Invoke(() =>
    {
        //Code to run on UI thread
    });
    //Code to run on a background thread                             
}).

是安全的假设"代码在后台线程上运行"将不会达到在任何情况下,直到"代码在UI线程上运行"完成执行?

Task.Factory.StartNew and Application.Current.Dispatcher.Inv

当您启动Task时,它将作为工作线程运行,并且它将阻塞直到Invoke(…)结束。当Invoke(..)完成后,它将在工作线程上继续执行。

"要在UI线程上运行的代码"将首先运行,然后是"要在后台线程上运行的代码"。

你就有可能在工作线程中做一些工作,比如读文件,写文件,查询数据库而不阻塞主线程,当需要时你可以通过Invoke(…)更新UI元素的数据

但是看看Async/Await,它可以使异步操作和更新UI元素更容易理解。

调度员。调用方法(Delegate, Object[])

在Dispatcher关联的线程上同步执行带有指定参数的指定委托。

https://msdn.microsoft.com/en-us/library/cc647509 (v = vs.110) . aspx

参见:

异步执行vs同步执行,这到底是什么意思?

因为调度员。调用是同步执行的,如何定义同步执行,您的假设是安全的。