有人可以阐明 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 绑定代码,那么效率会更高 - 因此在某些情况下,出于性能原因,您可能会选择
我读过这篇文章: 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 绑定代码,那么效率会更高 - 因此在某些情况下,出于性能原因,您可能会选择