C# Task.Factory.StartNew和Application.Current.Dispatcher.Invoke

C# Task.Factory.StartNew和Application.Current.Dispatcher.Invoke,c#,multithreading,.net-4.0,task-parallel-library,C#,Multithreading,.net 4.0,Task Parallel Library,鉴于此代码: Task.Factory.StartNew(() => { Application.Current.Dispatcher.Invoke(() => { //Code to run on UI thread }); //Code to run on a background thread }). 假设“在后台线程上运行的代码”在任何情况下都不会到达,直到“在UI线程

鉴于此代码:

Task.Factory.StartNew(() =>
{
    Application.Current.Dispatcher.Invoke(() =>
    {
        //Code to run on UI thread
    });
    //Code to run on a background thread                             
}).
假设“在后台线程上运行的代码”在任何情况下都不会到达,直到“在UI线程上运行的代码”完成执行,这样安全吗

Dispatcher.Invoke方法(委托,对象[])

在调度程序关联的线程上同步执行具有指定参数的指定委托

另请参见:


因为Dispatcher.Invoke是同步执行的,并且定义了同步执行的方式,所以您的假设是安全的。

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

“在UI线程上运行的代码”将首先运行,接下来是“在后台线程上运行的代码”

然后,您可以在工作线程中执行一些工作,如读取文件、写入文件、查询数据库而不阻塞主线程,并且在需要时可以通过调用(…)使用数据更新UI元素


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

是的,但这不是正确的方法。请考虑使用<代码> i进度< /COD>模式。