我有一个返回 IAsyncEnumerable
的函数。我想等待
它完成,但我不关心任何结果。我只关心调用函数的副作用。
如何轻松等待
IAsyncEnumerable
完成,而不使用 for 循环或将其转换为容器(例如 ToListAsync
)?
最佳答案
您可以使用 LastOrDefaultAsync
来自 System.Linq.Async 的运算符包,然后转换生成的 ValueTask<T>
到 Task
通过使用 AsTask
扩展方法。为了更加方便,您可以将这两个操作组合到一个扩展方法 ToTask
:
/// <summary>
/// Retrieves a Task object that represents the completion of this IAsyncEnumerable.
/// </summary>
public static Task ToTask<T>(this IAsyncEnumerable<T> source)
{
return source.LastOrDefaultAsync().AsTask();
}
但老实说,手动执行循环更简单,而且可能更有效:
public async static Task ToTask<T>(this IAsyncEnumerable<T> source)
{
await foreach (var _ in source.ConfigureAwait(false)) { }
}
LastOrDefaultAsync
运算符将在可枚举生命周期内将最后发出的元素保留在内存中,这可能会阻止该元素及时被垃圾收集。您可以通过在查询中包含 IgnoreElements
来防止这种情况发生。来自 System.Interactive.Async 的运算符包,但我认为这太麻烦了。
关于c# - 如何等待 IAsyncEnumerable 同时丢弃结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67072605/