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

时间:2012-10-03 12:31:06

标签: c# asynchronous f#

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

1 个答案:

答案 0 :(得分:28)

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

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

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

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

  • F#异步工作流程会自动支持取消,因此您无需通过CancellationToken

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

我写了一篇关于这个主题的更详细的文章:Asynchronous C# and F# (II.): How do they differ?