您是否考虑过编写展开的递归 while 循环?“展开的递归循环”的优点是:
- Stack<> 对象可以用完所有可用内存,但不会导致 stackoverflow
- 无论工作队列有多深,都可以通过一次测试取消函数调用并返回
- 如果愿意,您可以报告进度(例如进度百分比 = num_items_processed / 堆栈大小 + num_items_processed)
- 您可以随时暂停执行并稍后恢复
这是展开递归的一种潜在实现:
void RecursiveLoop(WorkItem item)
{
// Create a stack and push our item onto it
Stack<WorkItem> recursion = new Stack<WorkItem>();
recursion.Push(item);
// Loop through all items in the stack
while ((!cancel_flag_set) && (recursion.Count > 0)) {
WorkItem current = recursion.Pop();
// ... Do Work Here ...
// Now, queue up all the child items
foreach (WorkItem child in current.ChildItems) {
recursion.Push(child);
}
}
}