gpt4 book ai didi

c# - 任务.产量();同步 Action (); vs Task.Run(()=>SyncAction());

转载 作者:太空狗 更新时间:2023-10-29 23:05:50 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com