假设我只想快速使以下方法异步运行:
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
返回后,方法的其余部分将被分派(dispatch)回原始 SynchronizationContext
。如果你从 UI 线程运行它,你长时间运行的操作将在 UI 线程上执行,从而卡住它。因此,如果您的意图是避免 UI 阻塞 - Task.Yield
将不起作用。使用 Task.Run
不会发生这种情况。
关于c# - 任务.产量();同步 Action (); vs Task.Run(()=>SyncAction());,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39457294/