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

时间:2016-09-12 19:20:30

标签: c# async-await task-parallel-library

让我们说我想快速让以下方法异步运行:

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

1 个答案:

答案 0 :(得分:7)

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