如何在舊版本的 .NET Core / Framework 中使用 C# 8 的異步流(IAsyncDisposable / IAsyncEnumerable / IAsyncEnumerator)

C# 8.0 爲我們帶來了異步流,可以使用 async foreach,不過使用此語法需要 IAsyncEnumerable / IAsyncEnumerator 類型。本文介紹如何在舊版本的 .NET Framework 和舊版本的 .NET Core 中獲得此類型。


異步流所需版本

異步流需要 .NET Core 3.0 及以上版本才能直接支持。而如果是 .NET Framework,則是任何版本都不直接支持。

如果需要在早期版本使用異步流,需要安裝 Microsoft.Bcl.AsyncInterfaces 這個 NuGet 包。這就像在早期版本中使用 ValueTuple 需要安裝 System.ValueTuple 一樣。

安裝 Microsoft.Bcl.AsyncInterfaces

需要先在你的項目中安裝 NuGet 包:

Microsoft.Bcl.AsyncInterfaces

<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.1.0" />

安裝此包之後,即可在你的項目當中開啓異步流的支持。

一點說明:異步流中使用到了 ValueTask,此類型需要 System.Threading.Tasks.Extensions 包的支持。在 .NET Framework 4.8 以下會自動額外引入此包。

使用異步流

定義支持異步流的方法

private async IAsyncEnumerable<string> EnumerateTestsAsync()
{
    for (var i = 0; i < 3; i++)
    {
        await Task.Delay(100).ConfigureAwait(false);
        yield return $"歡迎訪問呂毅的博客,第 {i} 頁";
    }
}

使用 await foreach

直接使用 await foreach 即可使用 C# 8.0 帶來的異步流。

var verify = 0;
await foreach (var i in EnumerateTestsAsync())
{
    Assert.AreEqual(verify, i);
    verify++;
}
Assert.AreEqual(3, verify);

額外說明

記得如果你在 .NET Framework 4.8 或以下版本,.NET Core 3.0 以下版本編寫代碼時,自動啓用的 C# 語言版本是 7.3,所以你需要額外爲你的項目啓用 C# 8.0 才行。

<LangVersion>latest</LangVersion>

另外,由於 ValueTask 要求的最低 .NET Framework 版本爲 4.5.2,所以如果使用更低版本的 .NET Framework,將無法使用異步流。


參考資料


我的博客會首發於 https://blog.walterlv.com/,而 CSDN 會從其中精選發佈,但是一旦發佈了就很少更新。

如果在博客看到有任何不懂的內容,歡迎交流。我搭建了 dotnet 職業技術學院 歡迎大家加入。

知識共享許可協議

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名呂毅(包含鏈接:https://walterlv.blog.csdn.net/),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章