当前位置: 首页 > 编程语言 > C#

遍历树时使用线程分享

时间:2023-04-10 22:13:23 C#

遍历树时使用线程想加快遍历树的过程。这是一个节点的例子:classNode{publicListChildren{get;放;}publicintSompeProperty{得到;放;}publicStringSomeOtherProperty{get;){如果(ParentNode.Children==null)返回;foreach(ParentNode.Children中的varchild){TraverseTree(child);}}ParentNode.Children方法大约需要1毫秒,因为Node代表一个文件或目录。我只是用这个节点示例来说明我的观点。所以如果你想一想,如果第一个节点有4个子节点,每个子节点有10,000,000个后代,那么如果我们在单独的线程中利用并行编程来遍历这4个子节点中的每一个,我们可以提高这种遍历的速度。如果是这种情况,那么我会采用这种方法。但是如果我事先不知道树结构怎么办呢?我一直在想:1)开始遍历树,将前10个有子节点的节点放在一个堆栈上,然后开始在单独的线程上遍历每个节点。2)做类似的事情:staticvoidTraverseTree(NodeParentNode){if(ParentNode.Children==null)return;foreach(varchildinParentNode.Children){ThreadPool.QueueUserWorkItem(newWaitCallback((x)=>{TraverseTree(child);}),null);这通常会给我带来奇怪的结果,但速度要快得多。事实证明,使用任务可使算法加速约40%,结果如下:使用以下算法扫描我的整个C:驱动器大约需要5.81秒://directoryPath="C:"varnow=DateTime.Now;Taskt1=newTask(()=>{returnGetAllFilesInDirectory(directoryPath);});t1.开始();t1.等待();vardone=DateTime.Now-now;//done=5.81averageuse以下算法大约需要3.01秒来扫描我的整个C:驱动器://directoryPath="C:"varnow=DateTime.Now;//获取我的c:驱动器中的所有目录它应该只包含目录vardirectories=Directory.GetDirectories(directoryPath);//目录=17个目录:inetpub、MSOCache、PrefLogs、ProgramFiles、ProgramFiles(x86)等...Task[]myTasks=newTask[directories.Length];//为c:驱动器中的每个目录创建一个任务for(intk=0;k(()=>{returnGetAllFilesInDirectory(currentDir);});}//开始所有任务for(intk=0;k