在现代 C# 开发中,异步流(Asynchronous Streams)已成为处理大量数据、实时数据源或网络请求等场景的重要工具。自 C# 8.0 引入 IAsyncEnumerable<T> 接口以来,开发者可以像使用普通集合一样,以异步方式逐项获取数据。然而,在实际应用中,如何正确处理异步流中的异常,是确保程序健壮性的关键。

C# 异步流基于 IAsyncEnumerable<T> 接口,允许你使用 await foreach 循环来异步遍历数据序列。与传统的 IEnumerable<T> 不同,它支持在每次迭代时执行异步操作(如等待网络响应、数据库查询等)。
例如:
async IAsyncEnumerable<int> GenerateNumbersAsync(){ for (int i = 1; i <= 5; i++) { await Task.Delay(100); // 模拟异步操作 yield return i; }}// 使用 await foreach 遍历await foreach (var number in GenerateNumbersAsync()){ Console.WriteLine(number);}在异步流中,异常可能发生在多个阶段:生成器方法内部、yield return 语句前后、甚至是在消费端(即 await foreach 循环中)。如果不妥善处理这些异常,可能导致程序崩溃、资源泄漏或数据不一致。
常见的异常来源包括:
OperationCanceledException)最直接的方式是在消费异步流的地方使用 try-catch 块:
try{ await foreach (var item in GetDataStreamAsync()) { ProcessItem(item); }}catch (Exception ex){ Console.WriteLine($"处理异步流时发生错误: {ex.Message}"); // 记录日志、重试、通知用户等}这种方式能捕获整个流处理过程中抛出的任何异常,但一旦异常发生,整个流就会终止,后续数据将不再被处理。
有时你希望在数据生成阶段就处理异常,避免中断整个流。可以在 async 迭代器方法内部使用 try-catch:
async IAsyncEnumerable<string> FetchUrlsAsync(IEnumerable<string> urls){ foreach (var url in urls) { try { var content = await HttpClient.GetStringAsync(url); yield return content; } catch (HttpRequestException ex) { // 记录错误,但继续处理下一个 URL Console.WriteLine($"无法获取 {url}: {ex.Message}"); yield return $"[Error: {url}]"; } }}这样即使某个 URL 请求失败,流仍会继续处理其余项,提高了系统的容错能力。
在长时间运行的异步流中,用户可能希望取消操作。C# 支持通过 CancellationToken 实现优雅取消:
async IAsyncEnumerable<int> CountToHundredAsync([EnumeratorCancellation] CancellationToken ct = default){ for (int i = 1; i <= 100; i++) { ct.ThrowIfCancellationRequested(); // 检查是否被取消 await Task.Delay(100, ct); // 传递 token yield return i; }}// 调用时传入 CancellationTokenvar cts = new CancellationTokenSource();// ... 在某处调用 cts.Cancel()try{ await foreach (var num in CountToHundredAsync(cts.Token)) { Console.WriteLine(num); }}catch (OperationCanceledException){ Console.WriteLine("操作已被用户取消。");}注意:[EnumeratorCancellation] 特性用于将外部传入的 CancellationToken 自动绑定到方法参数,这是推荐做法。
CancellationToken。using 或 try-finally 确保资源释放。掌握 C#异步流 的异常处理机制,不仅能提升程序的稳定性,还能增强用户体验。无论是使用 IAsyncEnumerable、async await,还是结合 CancellationToken,合理的异常策略都是构建高质量 .NET 应用的关键一环。
希望本教程能帮助你深入理解 异常处理 在异步流中的应用。动手实践吧!
本文由主机测评网于2025-12-15发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025128099.html