【发布时间】:2014-05-04 16:43:49
【问题描述】:
我有一个递归遍历二叉树的函数。由于这些操作是计算密集型的,我想使用以下任务在递归函数中生成多个线程:
static void Traverse<T>(Tree<T> node, Action<T> action)
{
if (node == null) return;
var t1 = Task.Factory.StartNew(() => action(node.Data));
var t2 = Task.Factory.StartNew(() => Traverse(node.Left, action));
var t3 = Task.Factory.StartNew(() => Traverse(node.Right, action));
Task.WaitAll(t1, t2, t3);
}
现在这似乎确实有效。但是我想知道在以递归方式使用任务时是否需要注意什么。例如,如果树的深度很长,它是否无法以某种方式为较低级别创建任务并等待其他任务完成(这些任务永远不会完成,因为它们正在等待较低级别的任务完成)?
【问题讨论】:
-
您的代码出错,Traverse 必须是
Action<Tree<T>>,您的代码不会按原样编译,因为您将Tree<T>传递给action(node)但它只需要T。 -
感谢 Scott 指出。更正了代码。我做了一些更改以简化问题并引入了错误。
标签: c# multithreading recursion .net-4.0 task-parallel-library