Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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();
        }