void DoRightJob(TreeView tv, string topdir) { tv.Nodes.Clear(); TreeNode node = new TreeNode(topdir); JobSearch job = new JobSearch() { Path = topdir, Root = node, ChildJobRemaining = 0, }; BackgroundJob <JobSearch> worker = new BackgroundJob <JobSearch>(job); worker.DoWork += delegate { JobSearch Job = worker.JobInfo; var rootDirectory = new DirectoryInfo(topdir); node.Tag = rootDirectory; foreach (var dir in rootDirectory.GetDirectories()) { TreeNode dirnode = new TreeNode(dir.Name); dirnode.Tag = dir; Job.Root.Nodes.Add(dirnode); Job.ChildJobRemaining++; if (this.InvokeRequired) { this.BeginInvoke(new Action(() => DoSubJob(Job, dirnode, dir.FullName))); } Thread.Sleep(100); } while (Job.ChildJobRemaining > 0) { Thread.Sleep(100); } }; worker.RunWorkerCompleted += delegate { worker.JobInfo.Finish(); tv.SuspendLayout(); tv.Nodes.Add(node); //tv.ExpandAll(); tv.ResumeLayout(); }; worker.RunWorkerAsync(); }
void DoSubJob(JobSearch parentJob, TreeNode tp, string topdir) { JobSearch job = new JobSearch() { Path = topdir, Root = tp, ParentJob = parentJob, ChildJobRemaining = 0 }; BackgroundJob <JobSearch> worker = new BackgroundJob <JobSearch>(job); worker.DoWork += delegate { JobSearch Job = worker.JobInfo; var rootDirectory = tp.Tag as DirectoryInfo; try { var dirs = rootDirectory.GetDirectories(); foreach (var dir in dirs) { TreeNode dirnode = new TreeNode(dir.Name); dirnode.Tag = dir; Job.Root.Nodes.Add(dirnode); if (this.InvokeRequired) { this.BeginInvoke(new Action(() => DoSubJob(Job, dirnode, dir.FullName))); } Thread.Sleep(100); } } catch { } while (Job.ChildJobRemaining > 0) { Thread.Sleep(100); } }; worker.RunWorkerCompleted += delegate { worker.JobInfo.Finish(); worker.JobInfo.ParentJob.ChildJobRemaining--; }; worker.RunWorkerAsync(); }