树结构的并行任务

时间:2010-12-22 20:07:49

标签: c# task-parallel-library

我有这样的结构。

Parent-----Children1
|
-------Children2
         |
          -------Children2.1
         |
         --------Children2.2

我如何循环到这棵树并执行 新任务中的父级然后完成时 儿童1和儿童2然后平行完成 那么Children2.1和Children 2.2也是平行的。所以执行的顺序就像图中一样。 抱歉我的英文不好。

2 个答案:

答案 0 :(得分:3)

使用Parallel.Foreach在所有子节点上运行任务,然后最后调用所有子节点:

void run()
{
   do action on parent;
   DoTasks(parent);
}

void DoTasks(Node node)
{
  if (node.Childs == null) return;

  Parallel.Foreach(node.Childs, child => {do action})

  foreach(var child in node.Childs)
  {
    DoTasks(child);
  }
}

parallel.foreach等待所有任务完成。

答案 1 :(得分:0)

如果您正在寻找更强大的代码,请查看我在github上的以下项目:

Parallel async TreeWalker

它包含一个简单的.Net工具,用于有效地发现巨大的树结构(不消耗太多资源)并且仍然是并行的,没有瓶颈。它旨在处理异步调用。

在文件系统中发现目录结构的示例:

await TreeWalker.WalkAsync(root, new TreeWalkerOptions
{
  MaxDegreeOfParallelism = 5,
  ProcessElementAsync = async (element) =>
  {
      // this is the action that is executed on every element
      var el = element as FileSystemElement;
      var path = el.Path;
      var isDirectory = el.IsDirectory;

      await DoStuffAsync(el);
  }
});

这个单一方法调用使插件发现完整的树结构,并允许您对每个元素执行操作。

上面的 FileSystemElement 类是 ITreeElement 接口的内置示例实现,您可以为您的结构创建自己的类(或实现非常简单的接口)你现有的课程。)