让我们说我想快速让以下方法异步运行:
ResultType SynchronousCode(ParamType x)
{
return SomeLongRunningWebRequest(x);
}
以下两个代码示例的执行/计划方式有何不同?
async Task<ResultType> AsynchronousCode(ParamType x)
{
return await Task.Run(() => SomeLongRunningWebRequest(x));
}
与:相比:
async Task<ResultType> AsynchronousCode(ParamType x)
{
await Task.Yield();
return SomeLongRunningWebRequest(x);
}
我理解Task.Yield()调用将确保线程立即返回调用者,并且Task.Run()肯定会调度代码在ThreadPool上的某个地方运行,但是有效地执行这两种方法使方法异步?让我们假设我们在默认的SynchronizationContext上。
答案 0 :(得分:7)
虽然两个选项都不好,但存在差异(在GUI应用程序中很重要):在Task.Yield
返回后,方法的其余部分将被调度回原始SynchronizationContext
。如果你从UI线程运行它,你的长时间运行操作将在UI线程上执行,从而冻结它。因此,如果您的目的是避免阻止用户界面 - Task.Yield
无法工作。 Task.Run
不会发生。