是等待Task.Run(ioBoundOperation)等于ioBoundOperation?

时间:2016-08-17 17:54:27

标签: c# .net async-await ui-thread

鉴于我们在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

2 个答案:

答案 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线程。