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

时间:2015-08-25 17:39:16

标签: 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线程上运行的代码”执行完毕后,在任何情况下都不会达到“在后台线程上运行的代码”?

2 个答案:

答案 0 :(得分:1)

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

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

然后你可以在工作线程中做一些工作,比如读取文件,写文件,在数据库上查询而不阻塞主线程,并且在需要时你可以通过Invoke(...)更新带有数据的UI元素

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

答案 1 :(得分:0)

  

Dispatcher.Invoke方法(Delegate,Object [])

     

在与Dispatcher关联的线程上执行指定参数 synchronizedously 的指定委托。

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

也看到了这个:

Asynchronous vs synchronous execution, what does it really mean?

因为Dispatcher.Invoke是同步执行的,以及如何定义同步执行,所以你的假设是安全的。