Sve*_*ter 5 c# async-await c#-8.0 iasyncenumerable
IAsyncEnumerable
不可能运行两次枚举?
一旦CountAsync
运行,await foreach
就不会枚举任何项目。为什么?上好像没有 Reset 方法AsyncEnumerator
。
var count = await itemsToImport.CountAsync();
await foreach (var importEntity in itemsToImport)
{
// won't run
}
Run Code Online (Sandbox Code Playgroud)
数据来源:
private IAsyncEnumerable<TEntity> InternalImportFromStream(TextReader reader)
{
var csvReader = new CsvReader(reader, Config);
return csvReader.GetRecordsAsync<TEntity>();
}
Run Code Online (Sandbox Code Playgroud)
这与重置 IAsyncEnumerator 无关。此代码尝试生成第二个 IAsyncEnumerator,就像 IEnumerable.GetEnumerator() 一样,它只能在某些类型的集合上使用。如果 Enumerable(异步与否)是某种只向前数据结构的抽象,那么 GetEnumerator/GetAsyncEnumerator 将失败。
即使它没有失败,它有时也很昂贵。例如,它可能会在每次枚举时运行数据库查询或访问远程 API。这就是为什么 IEnumerable/IAsyncEnumerable 从函数中生成糟糕的公共返回类型的原因,因为它们无法描述返回集合的功能,并且几乎您唯一可以对值做的事情就是使用 .ToList/ToListAsync 将其具体化。
例如,这很好用:
static async IAsyncEnumerable<int> Col()
{
for (int i = 1; i <= 10; i++)
{
yield return i;
}
}
static void Main(string[] args)
{
Run().Wait();
}
static async Task Run()
{
var col = Col();
var count = await col.CountAsync();
await foreach (var dataPoint in col)
{
Console.WriteLine(dataPoint);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
619 次 |
最近记录: |