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_OperationTask.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 线程。