IEnumerable
中涉及带有this 2010 SO Post的递归主题。我很好奇,随着.Net Core 3.X中IAsyncEnumerable<T>
的出现,故事发生了怎样的变化?具体来说:
RecursiveSelect()
的IAsyncEnumerable<T>
扩展名的更新版本是什么样的?我的兴趣是对(远程)文件系统进行深度优先搜索,其中每次迭代都会导致一个远程文件在本地下载。为此,我打算创建一个异步“生成器”(长度未知的迭代器),可以使用await foreach
进行迭代。
作为测试用例,我首先只是尝试对本地目录进行深度优先搜索...将找到的文件复制到其他任意文件夹中。
我想确保我正在有效地使用IAsyncEnumerable
。
注意:即使对于深树来说,创建大量的IAsyncEnumerable
迭代器并不昂贵,但使用非递归方法仍然有意义,因为非递归方法可能能够“检查点”其进度并可以在某些原因导致应用程序崩溃时“恢复”。我不确定是否可以对递归方法进行同样的操作。
相同的考虑因素/解决方案应适用于IAsyncEnumerable
,您可以在sharplab.io中进行检查-状态机和按方法调用创建的迭代器,以及用于异步处理的额外代码(与“简单” IEnumerable with yield return比较):
此方法:
public static async IAsyncEnumerable<int> AEn()
{
for (int i = 1; i <= 10; i++)
{
await Task.Delay(1000);//Simulate waiting for data to come through.
yield return i;
}
}
由编译器翻译为:
[AsyncIteratorStateMachine(typeof(<AEn>d__0))]
public static IAsyncEnumerable<int> AEn()
{
return new <AEn>d__0(-2);
}
<AEn>d__0
是编译器生成的IAsyncEnumerable
的实现。
因此,应将堆栈实现用于深度优先搜索。