我有这样的结构。
Parent-----Children1
|
-------Children2
|
-------Children2.1
|
--------Children2.2
我如何循环到这棵树并执行 新任务中的父级然后完成时 儿童1和儿童2然后平行完成 那么Children2.1和Children 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上的以下项目:
它包含一个简单的.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 接口的内置示例实现,您可以为您的结构创建自己的类(或实现非常简单的接口)你现有的课程。)