C#的未來:異步序列

efbb 9年前發布 | 7K 次閱讀 C#

英文原文:C# Futures: Asynchronous Sequences

C#中的 async/await 語法已經得到了開發者們的廣泛接受,但現在開發者們提出了新的要求。他們希望能夠通過一種類似于“yield return”的語法從異步函數中返回多個值。在關于C# 7 的一條新的提議中,這一功能被稱為“異步序列”。

這條提議的提出者希望能夠使用以下兩種模式:

  • IObservable<T>,這是 Reactive Extensions(Rx)的基礎,后來成為了 .NET 4.0 中的一部分
  • IAsyncEnumerable<T>,這是由 Interactive Extensions(IX)項目所引入的類型,也用于 Entity Framework 7 中。

定義生產者

HaloFour 寫道:

從一個序列的生產者的角度來看,這兩種模式的 yield return 行為將有一些細微的差別。IObservable<T>可能會立即繼續執行,而 IAsyncEnumerable<T>會等到下一次調用 MoveNext ()方法時才會繼續執行。

對于 push 模型來說,使用 Observable.Create 方法就足夠了,這點已經基本為開發者所接受。而基于 IAsyncEnumerable<T>的 pull 模型實現起來就要麻煩許多。因此,這種時刻某種異步版本的迭代函數以及“yield return”語句就能夠大顯身手了。

定義消費者

HaloFour 繼續寫道:

從消費者的角度來說,這兩種模式的行為應當是相同的。Observable.ForEach 允許并發執行某些操作,而我認為允許 foreach 方法體運行多個并發線程的方式是非常不直觀的(假設派發這些線程時沒有使用 SynchronizationContext)。如果它的實現類似于 await 的工作方式,那么可以讓某種中間代碼(例如 SequenceAwaiter)處理從某個 IObservable<T>獲得結果緩沖的細節,或者使用某個擴展方法直接將其轉型為 IAsyncEnumerable<T>。

關于這個語法還沒有提供任何示例,但估計它看起來應該類似于這樣:

await foreach (var item in AsyncSource)

來自: InfoQ

 本文由用戶 efbb 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!