20

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

4

1 回答 1

28

它们不一样。主要区别在于 C# 使用标准 .NETTask<T>来表示异步计算,而 F# 使用自己的称为 .NET 的类型Async<T>

更具体地说,主要区别在于:

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

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

  • F# 异步工作流支持自动取消,因此您不必CancellationToken四处走动。

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

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

于 2012-10-03T12:54:01.270 回答