C#中的异步是否与F#中的异步相同?

And*_*ies 20 c# f# asynchronous

C#4.5中的异步实现与线程使用方式中的F#2完全相同吗?

Tom*_*cek 28

它们是不同的.主要区别在于C#使用标准.NET Task<T>来表示异步计算,而F#使用自己的类型调用Async<T>.

更具体地说,关键的区别是:

  • AC#async方法创建一个Task<T>立即启动的(热任务模型),而F#创建一个必须明确启动的计算(生成器模型).这意味着F#计算更容易编写(您可以编写更高级别的抽象).

  • 在F#中,您还可以更好地控制计算的开始方式.您可以使用Async.Start在后台启动计算或Async.StartImmediate在当前线程上启动它来开始计算.

  • F#异步工作流程支持自动取消,因此您无需传递CancellationToken.

  • 第一点的另一个结果可能是F#异步工作流也支持尾递归,因此您可以编写递归工作流(这在C#中不起作用,但C#不使用此编程样式)

我写了一篇关于这个主题的更详细的文章:异步C#和F#(II.):它们有什么不同?

  • 在F#中,当你使用特定的`SynchronizationContext`(即GUI线程)启动一个线程时,异步计算会跳回到这个`SynchronizationContext`.我找不到一个文档说明这在C#中是如何表现的,但我的实验表明它的行为相同 - 也就是说,如果你在GUI线程上开始`等待',那么你的计算的其余部分将在GUI线程上运行(即使你正在等待的计算在另一个线程上运行继续). (8认同)