2012-10-03 36 views

回答

27

它們是不同的。主要區別在於C#使用標準.NET Task<T>來表示異步計算,而F#使用其自己的類型Async<T>

更具體地說,關鍵的區別是:

  • AC#異步方法創建一個Task<T>是立即開始(熱任務模型),而F#創建,你必須明確地開始計算(發電機模型)。這意味着F#計算更容易編寫(您可以編寫更高級別的抽象)。

  • 在F#中,您還可以更好地控制計算是如何開始的。您可以使用Async.Start開始計算以在後臺啓動計算,或者在Async.StartImmediate開始計算以在當前線程上啓動計算。

  • F#異步工作流支持自動取消,所以你不必通過CancellationToken左右。

  • 也許是第一點的另一個後果是,F#異步工作流程還支持尾遞歸,所以你可以寫遞歸工作流程(這不會在C#中輕鬆地工作,但C#不使用這種編程風格)

我寫了一篇關於這個話題的更詳細的文章:Asynchronous C# and F# (II.): How do they differ?

+1

非常感謝!但是如何在線下使用線程? Don Syme在他的書「Expert F#」中指出F#使用線程跳轉。這對C#來說是一樣的還是有一些差異? – Andries

+8

在F#中,當您在具有特定'SynchronizationContext'(即GUI線程)的線程上啓動時,異步計算會跳回到此'SynchronizationContext'。我找不到一個文檔說明它在C#中的行爲,但我的實驗表明它的行爲相同 - 也就是說,如果您在GUI線程上開始「等待」,則其餘計算將在GUI線程上運行(即使您正在等待的計算在另一個線程上運行延續)。 –

+1

@TomasPetricek再次 - 關於F#的優秀信息。 –