是等待Task.Run(ioBoundOperation)等于ioBoundOperation
本文关键字:ioBoundOperation 等于 Run 等待 Task | 更新日期: 2023-09-27 18:02:53
给定我们在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
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线程,而第二个会。
No。只有在等待Long_IO_Bound_Operation()
时,UI线程才不会完全锁定,并使应用程序显示"未响应"。执行将不会继续,直到Long_IO_Bound_Operation()
完成,但它不会锁定UI线程。