鉴于我们在UI线程上的前提条件是
// doing other stuff
await Task.Run(Long_IO_Bound_Operation);
// do more stuff
完全相同:
// doing other stuff
Long_IO_Bound_Operation();
// do more stuff
通过“完全相同”,我的意思是最终结果,包括UI的冻结(或不结束)是否相同?
注意:请在回答之前参考https://msdn.microsoft.com/en-us/library/hh156528.aspx
答案 0 :(得分:2)
Task.Run
将生成一个新线程,并在该线程上执行Long_IO_Bound_Operation
,释放UI线程以获取其他内容。 await
关键字将保证在Task.Run
创建的任务完成后,执行将返回到UI线程。
换句话说,如果您不await
TaskRun
,// do more stuff
将在Task.Run
语句之后立即执行。但是await
关键字确保// do more stuff
延迟到Long_IO_Bound_Operation
在由Task.Run
await Task.Run(SomeProcess);
DoMoreStuff();
与:
相同Task.Run(SomeProcess).ContinueWith(t=>DoMoreStuff(), TaskScheduler.FromCurrentSynchronizationContext());
所以不,它不是“完全相同”,因为第一个不会阻止UI线程而第二个会阻止。
答案 1 :(得分:1)
没有。只有在等待Long_IO_Bound_Operation()
期间,UI线程才会完全锁定并让应用程序显示“无响应”。在Long_IO_Bound_Operation()
完成之前,Exectuion不会继续,但它不会锁定UI线程。