【问题标题】:C# Pogressbar & BackgroundworkerC# Pogressbar & Backgroundworker
【发布时间】:2018-08-09 07:39:50
【问题描述】:

单击按钮时,我的程序将执行以下操作: 该程序将文件复制到临时文件夹并从临时文件夹中创建一个 zip 文件。被复制的文件的路径存储在一个数组中。 只是为了说清楚:

// "files" has stored the paths

private void button2_Click(object sender, EventArgs e)
{
   foreach (var file in files)
   {
       File.Copy(file, tempPath + @"\" + System.IO.Path.GetFileName(file));
   }
}

我想在我的表单中包含一个进度条,用于提供有关所取得进度的反馈。对于每个复制的文件,进度条都应该移动。

我正在纠结如何以及在哪里报告进度。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
        int steps = files.Length;

        for (int i = 0; i < steps; i++)
        {
            // Do something...
        }
}

【问题讨论】:

    标签: c# arrays progress-bar backgroundworker


    【解决方案1】:

    您需要在ProgressChanged事件上注册一个处理程序,并在DoWork方法中调用ReportProgress(percentage)

    例子:

    class Program
    {
        private static BackgroundWorker _worker;
    
        static void Main(string[] args)
        {
            _worker = new BackgroundWorker();
            _worker.DoWork += Worker_DoWork;
            _worker.ProgressChanged += Worker_ProgressChanged;
            _worker.WorkerReportsProgress = true;
            _worker.RunWorkerAsync();
            Console.ReadLine();
        }
    
        private static void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            Console.WriteLine("Progress is {0}", e.ProgressPercentage);
        }
    
        private static void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            var worker = (BackgroundWorker)sender;
            for (int i = 0; i < 100; ++i)
            {
                worker.ReportProgress(i); // Reporting progress in percent
                Thread.Sleep(50);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:
      1. 将 ProgressBar 的 Maximum 属性设置为您的文件计数。这样您就不必自己计算百分比。

      2. 在复制文件的循环中,只需递增 ProgressBar 的 Value 属性即可。

      3. 在UI线程中复制文件并在后台线程中更新ProgressBar是没有意义的,如果确实耗时太长,应该反过来。

        李>

      这个答案也可能会有所帮助:How to update GUI with backgroundworker?

      【讨论】:

        【解决方案3】:

        我自己想通了:对于每个拥有数组并希望使用进度条和后台工作人员的人(可能有更好的方法):

        private void Button (object sender, EventArgs e)
            {
                backgroundWorker1.RunWorkerAsync();
            }
        
        void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                    var files = Directory.GetFiles(startPath, "*" + filetype, SearchOption.AllDirectories);
                    int max = files.Length;
                    int i = 0;
        
                foreach (var file in files)
                {
                    File.Copy(file, tempPath + @"\" + System.IO.Path.GetFileName(file));
                    backgroundWorker1.ReportProgress((i * 100) / max);
                    i++;
                }
            }
        

        【讨论】:

        • 当您得到一个包含您在最终解决方案中使用的信息的答案时,我几乎不会称其为“自己弄清楚”。但是,嘿,不客气……
        • @Oystein 我的主要问题是设置与数组相关的 .ReportProgress 循环。我仍然是一个初学者,有时即使是最简单的事情也看起来很复杂,因为我在这一点上从来没有更好地了解过。不过我还是要感谢你的评论。
        • 您没有说ReportProgress 是您的问题中的一个问题。你只是说你需要关于如何以及在哪里报告进度的帮助BackgroundWorker,这是我提供的。
        • @Oystein 我提供了代码来明确我的案例的外观。我想建立一份进度报告,是的。但是没有人说在我的情况下使用“for”循环来更新是不可能的。我不想要任何无用的讨论,就像我说的:感谢您的帮助和时间。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多