我正在查看关于C#尾递归的这篇文章。
我理解了他们使用的一般示例(阶乘),并尝试将其应用于我使用任务递归的情况。我在尝试将上面的示例应用于没有返回类型的
想象一下,我有以下C#类和方法:
我理解了他们使用的一般示例(阶乘),并尝试将其应用于我使用任务递归的情况。我在尝试将上面的示例应用于没有返回类型的
Task
时遇到了问题。想象一下,我有以下C#类和方法:
public class Crawler(CancellationToken token)
{
this.cancelToken = token;
}
public async Task CrawlData(string dataLocation, bool repeat = false)
{
/*Most of processing done here, omitted for space...*/
while(canCrawl == false)
{
await Task.Delay(250);
}
await CrawlData(dataLocation, repeat);
}
目前这个程序很好!由于canCrawl
等于false时会有延迟,因此它可以长时间运行(天、周、月)而没有问题。
如果有人感到困惑,我之所以在Tasks中使用递归,是因为我从另一个类中调用了这个方法,该类依赖于Task.Run()
来最初执行这个方法,并且它依赖于该Task
在递归仍在进行时保持活动状态,以便在第一次调用后不会跳转到结束。这一切都与能够在进程中取消任务有关。
我的担忧是,如果这个程序运行的时间足够长,它最终会导致StackOverflowException
,就像本文开头的阶乘示例一样。
我尝试将那个示例应用到没有返回类型的Task
上,这就是我正在使用的,但我没有成功。
你们中有谁有使用Task
进行尾递归的经验吗?