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时,它将作为工作线程运行,并且它将阻塞直到Invoke(…)结束。当Invoke(..)完成后,它将在工作线程上继续执行。
"要在UI线程上运行的代码"将首先运行,然后是"要在后台线程上运行的代码"。
你就有可能在工作线程中做一些工作,比如读文件,写文件,查询数据库而不阻塞主线程,当需要时你可以通过Invoke(…)更新UI元素的数据
但是看看Async/Await,它可以使异步操作和更新UI元素更容易理解。
调度员。调用方法(Delegate, Object[])
在Dispatcher关联的线程上同步执行带有指定参数的指定委托。
https://msdn.microsoft.com/en-us/library/cc647509 (v = vs.110) . aspx
参见:
异步执行vs同步执行,这到底是什么意思?
因为调度员。调用是同步执行的,如何定义同步执行,您的假设是安全的。