繁体   English   中英

Task.Yield(); SyncAction(); vs Task.Run(()=> SyncAction());

[英]Task.Yield(); SyncAction(); vs Task.Run(()=>SyncAction());

假设我想快速使以下方法异步运行:

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上。

虽然两个选项都很糟糕,但存在差异(在GUI应用程序中很重要):在Task.Yield返回后,方法的其余部分将被调度回原始的SynchronizationContext 如果你从UI线程运行它,你的长时间运行操作将在UI线程上执行,从而冻结它。 因此,如果您的目的是避免UI阻塞 - Task.Yield将无法正常工作。 使用Task.Run不会发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM