鉴于此代码:
Task.Factory.StartNew(() =>
{
Application.Current.Dispatcher.Invoke(() =>
{
//Code to run on UI thread
});
//Code to run on a background thread
}).
是否可以安全地假设“在UI线程上运行的代码”执行完毕后,在任何情况下都不会达到“在后台线程上运行的代码”?
答案 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是同步执行的,以及如何定义同步执行,所以你的假设是安全的。