C# C中的异步实现与F中的异步实现相同吗?

C# C中的异步实现与F中的异步实现相同吗?,c#,asynchronous,f#,C#,Asynchronous,F#,C#4.5中的异步实现与F#2中线程的使用方式完全相同吗?它们是不同的。主要区别在于C#使用标准的.NET任务来表示异步计算,而F#使用自己的类型Async 更具体地说,关键区别在于: C#async方法创建一个立即启动的任务(热任务模型),而F#创建一个必须显式启动的计算(生成器模型)。这意味着F#计算更容易编写(您可以编写更高级别的抽象) 在F#中,您还可以更好地控制计算是如何开始的。您可以使用Async.start在后台启动计算,或使用Async.startimimediate在当前线程

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

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

更具体地说,关键区别在于:

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

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

  • F#异步工作流支持自动取消,因此您不必到处传递
    CancellationToken

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


我写了一篇关于这个话题的更详细的文章:

非常感谢!但如何在引擎盖下使用螺纹?Don Syme在他的书《专家F》中指出,F使用线程跳跃。这对于C#是相同的还是有一些不同?在F#中,当您在具有特定的
SynchronizationContext
(即GUI线程)的线程上启动时,异步计算跳回该
SynchronizationContext
。我找不到说明这在C#中如何运行的文档,但我的实验表明它的行为是相同的——也就是说,如果在GUI线程上启动
wait
ing,那么其余的计算将在GUI线程上运行(即使正在等待的计算在另一个线程上运行continuation)。