Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net核心3.1:&x27;iSyncEnumerable<;字符串>';不包含';GetWaiter';_C#_.net Core 3.1_C# 8.0_Iasyncenumerable - Fatal编程技术网

C# .net核心3.1:&x27;iSyncEnumerable<;字符串>';不包含';GetWaiter';

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

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

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

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;
}