C# .net核心3.1:&x27;iSyncEnumerable<;字符串>';不包含';GetWaiter';
我有一个.net core 3.1控制台应用程序 我有一个具有以下签名的方法:C# .net核心3.1:&x27;iSyncEnumerable<;字符串>';不包含';GetWaiter';,c#,.net-core-3.1,c#-8.0,iasyncenumerable,C#,.net Core 3.1,C# 8.0,Iasyncenumerable,我有一个.net core 3.1控制台应用程序 我有一个具有以下签名的方法: public async IAsyncEnumerable<string> GetFilePathsFromRelativePathAsync(string relativePath) public异步IAsyncEnumerable GetFilePathsFromRelativePathAsync(字符串relativePath) 如果我称之为: private async Task<IEn
public async IAsyncEnumerable<string> GetFilePathsFromRelativePathAsync(string relativePath)
public异步IAsyncEnumerable GetFilePathsFromRelativePathAsync(字符串relativePath)
如果我称之为:
private async Task<IEnumerable<FileUpload>> GetFileUploadsAsync(string relativePath)
{
...
var filePaths = await service.GetFilePathsFromRelativePathAsync(relativePath);
...
}
专用异步任务GetFileUploadsAsync(字符串相对路径)
{
...
var filepath=await service.GetFilePathsFromRelativePathAsync(relativePath);
...
}
我得到以下错误:
错误CS1061“IAsyncEnumerable”不包含定义
对于“GetAwaiter”和无可访问的扩展方法“GetAwaiter”
接受类型为“IAsyncEnumerable”的第一个参数可能是
找到(是否缺少using指令或程序集
参考?)
正确的语法是:
await foreach(var filePath in service.GetFilePathsFromRelativePathAsync(relativePath))
{
....
}
IAsyncEnumerable
用于返回可单独处理的元素流。这就是为什么这个特性被实际调用,导致了相当多的混乱
转换为任务IEnumerable
,并在创建新的FileUpload
实例后立即返回它们:
private async IAsyncEnumerable<FileUpload> GetFileUploadsAsync(string relativePath)
{
await foreach(var filePath in service.GetFilePathsFromRelativePathAsync(relativePath))
{
var upload = new FileUpload(filePath);
yield return upload;
}
}
最好的代码是你不会写的代码。该项目为IAsyncEnumerable提供LINQ运算符,包括,并且可以找到
代码非常简单,但包含一些优化,例如使用
ValueTask
而不是Task
,以及对来自其他操作符(如GroupBy和Reverse)的数据进行特殊处理,这些操作符在生成输出之前必须消耗整个IAsyncEnumerable
。好,这很有趣。。。那么,有没有办法在没有foreach的情况下从IAsyncEnumerable转到Task?您可以将方法改为IAsyncEnumerable
,并在生成新的FileUpload实例后立即返回它们。或者,您可以使用(或复制)运算符中的代码将每个项目添加到列表中,并在末尾返回列表。请在第一个和第二个foreach循环示例中将从重命名为到。@Deano您的意思是中的?正确。啊!谢谢你,伙计。
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;
}