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

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

最佳答案

虽然这两个选项都不好,但有一个区别(在 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/

相关文章:

c# - 在 foreach 循环中创建任务

c# - 如何为开放泛型类型声明变量?可能的?

c# - 当消费者不堪重负时,如何让快速生产者暂停?

javascript - 异步函数总是返回 undefined

c# - 在异步方法中返回 Task.Run

c# - 散列/分片 ActionBlocks

c# - 我可以使用 async/await 来模拟后台 worker 吗?

c# - asp gridview中需要加一条横线来划分行

c# - System.Text.Json JsonConverter 字符串数组到单个字符串

rust - 为什么我需要先固定一个 future ,然后才能等待对它的引用?