C# 8.0 搶先看 -- Async Stream (5) 在 preview 2 以後的改變

Async Stream 的宣告在 Visual Studio 2019 preview 2 後有點小改變

本篇文章使用環境
開發環境 Visual Studio 2019 Preview 4 (16.0.0 Preview 4)
框架       .NET Core 3.0.100-preview-010184
編譯器    C# 8.0 beta

Preview 嘛,難免就是會遇見改來改去的情形,Async Stream 在 Visaul Studio 2019 preview 2 後有了一些小小的改變。

1. IAsyncEnumerable<T> 介面的改變

原來在 preview 1 時候的 IAsyncEnumerable<T> 中 GetAsyncEnumerator 方法是沒有參數的:

public interface IAsyncEnumerable<out T>
{
    IAsyncEnumerator<T> GetAsyncEnumerator();
}

在 preview 2 後,GetAsyncEnumerator 方法加入了 CancellationToken 型別作為參數,讓這個非同步能夠具有被中止的可能性,具體內容如下:

public interface IAsyncEnumerable<out T>
{
    IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default);
}

2. 補齊缺乏的型別

C# 8.0 搶先看 -- Async Stream (2) 中曾經提到在當時的環境下使用 yield return 會遇到編譯失敗,原因是當時的框架中缺乏 struct ManualResetValueTaskSourceLogic<TResult> 與 interface IStrongBox<T> 兩個型別導致失敗。在 .NET Core 3.0 preview 2 後也已經補齊。所以就不需要再自己硬是補上這個兩個型別了。

另外,關於在 .NET Core  使用 async stream 的範例也已經修正,參考 AsyncStreamReadLineSample 。 但是 yield return 移植到傳統 .NET Framework 的那個範例已經掛了,有時間再來研究看看要怎麼瞎弄才可能移植,不過如果在傳統 .NET Framework 不使用 yield return 而是直接實作 IAsyncEnumerable<string>, IAsyncEnumerator<string> 介面還是可行的。