19
在使用線程的方式中,C#4.5中的異步實現與F#2中的異步實現完全相同嗎?C#中的異步與F#中的實現相同嗎?
在使用線程的方式中,C#4.5中的異步實現與F#2中的異步實現完全相同嗎?C#中的異步與F#中的實現相同嗎?
它們是不同的。主要區別在於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?
非常感謝!但是如何在線下使用線程? Don Syme在他的書「Expert F#」中指出F#使用線程跳轉。這對C#來說是一樣的還是有一些差異? – Andries
在F#中,當您在具有特定'SynchronizationContext'(即GUI線程)的線程上啓動時,異步計算會跳回到此'SynchronizationContext'。我找不到一個文檔說明它在C#中的行爲,但我的實驗表明它的行爲相同 - 也就是說,如果您在GUI線程上開始「等待」,則其餘計算將在GUI線程上運行(即使您正在等待的計算在另一個線程上運行延續)。 –
@TomasPetricek再次 - 關於F#的優秀信息。 –