有人可以阐明 F# 6 中 Task 和 Async 之间的用例吗?

Can someone clarify the use cases betwen Task and Async in F# 6?

我读过这篇文章: https://www.compositional-it.com/news-blog/task-vs-async/ 涵盖了 F# 6 中的更新。

有一章介绍了task表达式及其与async的异同。

我的理解是任务是一个块,我们可以在其中进行异步调用,但它是在常规流程中执行的,而异步块是我们所知道的,它创建稍后将执行的表达式,按需。

我非常广泛地使用异步,因为我正在使用一个执行大量数据流和数据库写入的应用程序,所以一切几乎都是异步的。

我能看到任务表达式的唯一用途是与异步 api 接口,我现在希望异步块到 运行。 本质上,替换:

async {
    do! callMyAsyncOnlyApi ()
} |> Async.RunSynchronously

task {
    do! callMyAsyncOnlyApi ()
}

这会 运行 立即并在等待时释放 cpu。

我一定是遗漏了什么 :D

文章在结论部分提供了一个很好的总结:

Personally, I reach for async {} by default unless I am dealing with external Task based libraries or I face a specific performance issue (which hasn't happened yet!). I find it fits the functional mindset better and is easier to use.

The reality is however that a great deal of libraries have been written with Task in mind, and it is fantastic that F# now has first class, out of the box support for the pattern.

我认为没有什么要补充的:

  • F# 总是有 async 并且 async 是一个合理的默认值
  • async 有很多优点 - 它支持取消并使用更可组合(对 F# 更友好)的“生成器”模型
  • .NET 更突出地使用 Task<T>,因此如果您要与很多 .NET 库交互(正如您的问题所暗示的),那么您可以选择 task
  • task 如果您有 CPU 绑定代码而不是 IO 绑定代码,那么效率会更高 - 因此在某些情况下,出于性能原因,您可能会选择