在等待的同一行访问Task的返回值



我有一个方法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,而是返回不具有属性ContentTask<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();

最新更新