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 包:
<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,將無法使用異步流。
參考資料
- Async streams - C# 8.0 specification proposals - Microsoft Docs
- Using async disposable and async enumerable in frameworks older than .NET Core 3.0 - StrathWeb. A free flowing web tech monologue.
我的博客會首發於 https://blog.walterlv.com/,而 CSDN 會從其中精選發佈,但是一旦發佈了就很少更新。
如果在博客看到有任何不懂的內容,歡迎交流。我搭建了 dotnet 職業技術學院 歡迎大家加入。
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名呂毅(包含鏈接:https://walterlv.blog.csdn.net/),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫。