Dev*_*345 5 c# task-parallel-library async-await
假设我想快速使以下方法异步运行:
ResultType SynchronousCode(ParamType x)
{
return SomeLongRunningWebRequest(x);
}
Run Code Online (Sandbox Code Playgroud)
以下两个代码示例的执行/计划方式有何不同?
async Task<ResultType> AsynchronousCode(ParamType x)
{
return await Task.Run(() => SomeLongRunningWebRequest(x));
}
Run Code Online (Sandbox Code Playgroud)
相比:
async Task<ResultType> AsynchronousCode(ParamType x)
{
await Task.Yield();
return SomeLongRunningWebRequest(x);
}
Run Code Online (Sandbox Code Playgroud)
我知道Task.Yield()调用将确保线程立即返回到调用者,并且Task.Run()肯定会调度代码在ThreadPool上的某个地方运行,但是这两种方法都能有效地实现该方法异步?让我们假设这个问题我们在默认的SynchronizationContext上.
虽然两个选项都很糟糕,但存在差异(在GUI应用程序中很重要):在Task.Yield返回之后,方法的其余部分将被分派回原始版本SynchronizationContext.如果你从UI线程运行它,你的长时间运行操作将在UI线程上执行,从而冻结它.因此,如果您的目的是避免UI阻止 - Task.Yield将无法正常工作.随着Task.Run这不会发生.