如何在异常时静默终止IAsyncEnumerable异步迭代器?
如何在异常发生时静默终止IAsyncEnumerable迭代器?
你可以通过手动控制异步枚举器的方式重写代码,避开yield return不能放在try/catch块内的限制,同时保留编译器生成迭代器的特性。
解决方案代码
public async IAsyncEnumerable<T2> Map<T1, T2>(IAsyncEnumerable<T1> source, Func<T1, T2> map) { using var enumerator = source.GetAsyncEnumerator(); bool hasNext; try { hasNext = await enumerator.MoveNextAsync(); } catch { yield break; } while (hasNext) { yield return map(enumerator.Current); try { hasNext = await enumerator.MoveNextAsync(); } catch { yield break; } } }
原理说明
- 手动获取
IAsyncEnumerator,将MoveNextAsync()的调用单独放在try/catch块中,而yield return放在块外,符合编译器的语法限制。 - 每次调用
MoveNextAsync()时如果抛出异常(包括取消令牌触发的TaskCancelledException),直接执行yield break静默终止迭代。 - 全程依赖编译器生成的迭代器逻辑,没有手动实现完整的迭代器模式。
内容的提问来源于stack exchange,提问作者Impworks
相关产品推荐
相关产品推荐

