await Task.Run(ioBoundOperation) 是否等于 ioBoundOperation?
Is await Task.Run(ioBoundOperation) equals to ioBoundOperation?
假设我们在 UI 线程上,是
// doing other stuff
await Task.Run(Long_IO_Bound_Operation);
// do more stuff
完全相同:
// doing other stuff
Long_IO_Bound_Operation();
// do more stuff
"exactly the same" 我的意思是 UI 的最终结果,包括冻结(或不冻结)是一样的吗?
注意:回答前请参考https://msdn.microsoft.com/en-us/library/hh156528.aspx
Task.Run
将产生一个新线程并在该线程上执行 Long_IO_Bound_Operation
释放 UI 线程用于其他事情。一旦 Task.Run
创建的任务完成,await
关键字将保证执行返回到 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());
所以不,不是 "exactly the same" 因为第一个不会阻塞 UI 线程而第二个会。
没有。仅在等待 Long_IO_Bound_Operation()
时,UI 线程不会完全锁定并让应用程序显示 "Not Responding"。 Long_IO_Bound_Operation()
完成后才会继续执行,但不会锁定 UI 线程。
假设我们在 UI 线程上,是
// doing other stuff
await Task.Run(Long_IO_Bound_Operation);
// do more stuff
完全相同:
// doing other stuff
Long_IO_Bound_Operation();
// do more stuff
"exactly the same" 我的意思是 UI 的最终结果,包括冻结(或不冻结)是一样的吗?
注意:回答前请参考https://msdn.microsoft.com/en-us/library/hh156528.aspx
Task.Run
将产生一个新线程并在该线程上执行 Long_IO_Bound_Operation
释放 UI 线程用于其他事情。一旦 Task.Run
创建的任务完成,await
关键字将保证执行返回到 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());
所以不,不是 "exactly the same" 因为第一个不会阻塞 UI 线程而第二个会。
没有。仅在等待 Long_IO_Bound_Operation()
时,UI 线程不会完全锁定并让应用程序显示 "Not Responding"。 Long_IO_Bound_Operation()
完成后才会继续执行,但不会锁定 UI 线程。