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)