C#4.5中的异步实现与使用线程的方式中的F#2完全相同吗?
答案 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?