gpt4 book ai didi

c# - .net 核心 3.1 : 'IAsyncEnumerable' does not contain a definition for 'GetAwaiter'

转载 作者:行者123 更新时间:2023-12-04 00:01:54 25 4
gpt4 key购买 nike

我有一个 .net core 3.1 控制台应用程序。

我有一个具有以下签名的方法:

public async IAsyncEnumerable<string> GetFilePathsFromRelativePathAsync(string relativePath)

如果我称之为:
private async Task<IEnumerable<FileUpload>> GetFileUploadsAsync(string relativePath)
{
...
var filePaths = await service.GetFilePathsFromRelativePathAsync(relativePath);
...
}

我收到以下错误:

Error CS1061 'IAsyncEnumerable' does not contain a definition for 'GetAwaiter' and no accessible extension method 'GetAwaiter' accepting a first argument of type 'IAsyncEnumerable' could be found (are you missing a using directive or an assembly reference?)

最佳答案

正确的语法是:

await foreach(var filePath in service.GetFilePathsFromRelativePathAsync(relativePath))
{
....
}
IAsyncEnumerable 用于返回可以单独处理的元素流。这就是为什么该功能实际上被称为 async streams ,引起了相当多的困惑
转换为任务< IEnumerable< FileUpload>>
最好的解决方案是不转换,而是将签名更改为 IEnumerable<FileUpload> 并在创建后立即返回新的 FileUpload 实例:
private async IAsyncEnumerable<FileUpload> GetFileUploadsAsync(string relativePath)
{
await foreach(var filePath in service.GetFilePathsFromRelativePathAsync(relativePath))
{
var upload = new FileUpload(filePath);
yield return upload;
}
}
您还可以收集所有结果,将它们存储在列表中并返回它们,例如使用 ToListAsync 扩展方法:
public static async Task<List<T>> ToListAsync<T>(this IAsyncEnumerable<T> source, CancellationToken cancellationToken=default)
{
var list = new List<T>();
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
{
list.Add(item);
}

return list;
}
最好的代码是你不写的代码。 System.Linq.Async 项目为 IAsyncEnumerable 提供了 LINQ 运算符,包括 ToList ,可以在 on NuGet 中找到。
代码非常简单,但包括一些优化,例如使用 ValueTask 代替 Task 以及对来自 GroupBy 和 Reverse 等其他运算符的数据的特殊处理,这些运算符在产生输出之前必须消耗整个 IAsyncEnumerable

关于c# - .net 核心 3.1 : 'IAsyncEnumerable<string>' does not contain a definition for 'GetAwaiter' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60148340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com