如何在向进度更改事件报告 5% 后取消后台工作者操作



在dowork事件中,我做了:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            var root = Convert.ToString(e.Argument);  // txtHost.Text;
            searched_until_now_dirs = 0;
            total_dirs = 1;
            max_percentage = 0;
            last_update = DateTime.Now;
            directories_real_time = new TreeNode();
            var dirNode = CreateDirectoryNode(root, "root",1);
            e.Result = dirNode;
        }

然后在进度更改事件中:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.toolStripStatusLabel1.Text = e.UserState.ToString();
            this.toolStripProgressBar1.Value = Math.Min(this.toolStripProgressBar2.Maximum, e.ProgressPercentage);
            label11.Text = numberOfFiles.Count.ToString();
            if (e.ProgressPercentage == 5)
            {
                backgroundWorker1.CancelAsync();
            }
        }

首先,如果它是 5,它永远不会进入它继续下去。永远不要到达取消异步行。我希望在完成 5% 的工作后,它将被取消并进入已完成的事件。

这是我在CreateDirectoryNode方法中做进度报告的地方:

private int total_dirs;
        private int searched_until_now_dirs;
        private int max_percentage;
        private TreeNode directories_real_time;
        private string SummaryText;
        private TreeNode CreateDirectoryNode(string path, string name , int recursive_levl )
        {
            var directoryNode = new TreeNode(name); to its Tag
            var directoryListing = GetDirectoryListing(path);
            var directories = directoryListing.Where(d => d.IsDirectory);
            var files = directoryListing.Where(d => !d.IsDirectory);
            total_dirs += directories.Count<FTPListDetail>();
            searched_until_now_dirs++;
            int percentage;
            foreach (var dir in directories)
            {
                directoryNode.Nodes.Add(CreateDirectoryNode(dir.FullPath, dir.Name, recursive_levl+1));

                if (recursive_levl == 1)
                {
                    TreeNode temp_tn = (TreeNode)directoryNode.Clone();
                    this.BeginInvoke(new MethodInvoker( delegate
                    {
                        UpdateList(temp_tn);
                    }));
                }

                percentage = (searched_until_now_dirs * 100) / total_dirs;
                if (percentage > max_percentage)
                {
                    SummaryText = String.Format("Searched dirs {0} / Total dirs {1}", searched_until_now_dirs, total_dirs);
                    max_percentage = percentage;
                    backgroundWorker1.ReportProgress(percentage, SummaryText);
                }
            }
            percentage = (searched_until_now_dirs * 100) / total_dirs;
            if (percentage > max_percentage)
            {
                SummaryText = String.Format("Searched dirs {0} / Total dirs {1}", searched_until_now_dirs, total_dirs);
                max_percentage = percentage;
                backgroundWorker1.ReportProgress(percentage, SummaryText);
            }
            foreach (var file in files)
            {
                TreeNode file_tree_node = new TreeNode(file.Name);
                file_tree_node.Tag = "file" ; // you can put here any object you want..
                directoryNode.Nodes.Add(file_tree_node);
                numberOfFiles.Add(file.FullPath);
            }

            return directoryNode;
        }

我没有看到您向工人报告进度。下面的示例应该涵盖您的案例。

    public Form1()
    {
        InitializeComponent();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }
    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        BackgroundWorker worker = (BackgroundWorker)sender;
        if (e.ProgressPercentage >= 5)
        {
            worker.CancelAsync();
        }
    }
    void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = (BackgroundWorker)sender;
        while(!worker.CancellationPending)
        {
            // TODO: do something.
            // TODO: update percentProgress 
            // backgroundWorker.ReportProgress(percentProgress);
        }
        if (worker.CancellationPending)
        {
            e.Cancel = true;
        }
    }

最新更新