c# - 如何等待 IAsyncEnumerable 同时丢弃结果

标签 c# asynchronous async-await iasyncenumerable

我有一个返回 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/

相关文章:

ios - PFQuery同步调用有效,异步调用失败

c# - PostgreSQL:命令已经在进行中

node.js - 将异步等待查询包装在 try catch 中

python - Python 3.4 中的 "async with"

c# - 您能否拥有一个从仅具有用户级权限的客户端应用程序链接的具有管理员权限的 DLL?

c# - 如何按索引对项目进行分组? C# 联机

html - React - 转换 HTML 脚本标签以异步加载 SDK

c# 在任何地方检测鼠标点击(表单内部和外部)

c# - RegEx - 使用符号匹配但不替换它们

javascript - 如何访问返回的 Promise 的值?