是等待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(ioBoundOperation)等于ioBoundOperation

Task.Run将生成一个新线程并在该线程上执行Long_IO_Bound_Operation,从而为其他线程释放UI线程。await关键字将保证一旦Task.Run创建的任务完成,执行将返回UI线程。

换句话说,如果你不执行awaitTaskRun, // 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线程。

相关文章:
  • 没有找到相关文章