c# - 等待 Task.Run 与等待

标签 c# asynchronous async-await

我在网上搜索过很多关于 Task.Run 和 await async 的问题,但是有一个具体的使用场景我不太明白其中的区别。我相信场景非常简单。

await Task.Run(() => LongProcess());

对比

await LongProcess());

LongProcess 是一个异步方法,其中包含一些异步调用,例如使用 await ExecuteReaderAsync() 调用 db。

问题:

在这个场景下两者有什么区别吗?感谢任何帮助或输入,谢谢!

最佳答案

Task.Run 可以将要处理的操作发布到不同的线程。这是唯一的区别。

这可能有用 - 例如,如果 LongProcess不是真正的异步,它会使调用者返回得更快。但是对于一个真正的异步方法,使用 Task.Run 是没有意义的。 ,并可能造成不必要的浪费。

不过要小心,因为 Task.Run 的行为将根据重载决议而改变。在您的示例中,Func<Task>将选择过载,这将(正确地)等待 LongProcess完成。但是,如果使用非任务返回委托(delegate),Task.Run只会等待执行到第一个 await (请注意,这就是 TaskFactory.StartNew始终 的行为方式,所以不要使用它)。

关于c# - 等待 Task.Run 与等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38739403/

相关文章:

c# - 如何更改嵌套 json 结构中的键值对 C#

c# - 将连接字符串从 linqpad 传递到自定义库导致登录失败

c# - 替代 CurrentManagedThreadId 在等待过程中保持不变?

javascript - 如何在node.js中从异步创建同步功能?

c# - 重载解析和异步等待

flutter - 为什么此 future 函数返回空列表抖动

c# - F#'s async state machines the same as C#' 是 async 还是 go-lang 的 go 命令?

c# - 为什么我的 .net core xunit 测试找不到我的 appsettings.json?

c# - 如何使用 C# 创建带有粗体标题行的 csv 文件

node.js - 为什么 async.map 函数与 native fs.stat 函数一起使用?