我有一个方法SplitInto2DArray,它将表示CSV文件的File对象转换为File2DArray类。
File2DArray是一个简单的类,它包含一个用于Headers的数组和一个用于body的2D数组。
public class File2DArray
{
public string[] Headers;
public string[][] Content;
}
要将File对象的数组转换为File2DArray对象,我执行了以下操作:Files.Select(File => File.SplitInto2DArray().Content
然而,我把SplitInto2DArray做成了一个异步函数,因为它用许多大的CSV文件阻塞了线程。当我这样做时,我不得不更改Select
函数,但我遇到了一个问题。
.Select(async File => await File.SplitInto2DArray().Content
SplitInto2DArray
不再返回File2DArray
,而是返回不具有属性Content
的Task<File2DArray>
。
我可以把它变成一个多行lambda,但我很感兴趣的是,是否有一种方法可以在等待的同一行访问await Task<T>
的输出。
尝试Files.Select(async File => (await File.SplitInto2DArray()).Content)
有一对括号包含await File.SplitInto2DArray()
。
当await
关键字阻塞当前线程直到异步函数完成并返回时,Task<File2DArray>
变为File2DArray
。
也许这不是一个准确的解释,但它应该有效。
您可以使用System.Linq.Anc-nuget包为IAsyncEnumerable
获得良好的扩展
PM> Install-Package System.Linq.Async
你的代码看起来像
var contents = await Files.ToAsyncEnumerable()
.SelectAwait(async file => await file.SplitInto2DArray())
.Select(array => array.Content)
.ToListAsync();