繁体   English   中英

C#Pogressbar和Backgroundworker

[英]C# Pogressbar & Backgroundworker

单击按钮时,我的程序将执行以下操作:该程序将文件复制到临时文件夹,并从该临时文件夹中创建一个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...
        }
}

您需要在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);
        }
    }
}
  1. 将ProgressBar的Maximum属性设置为您的文件数。 这样,您不必自己计算百分比。

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

  3. 复制UI线程中的文件并在后台线程中更新ProgressBar没有意义,如果确实花费太长时间,则应该采取另一种方法。

这个答案也可能会进一步帮助您: 如何使用backgroundworker更新GUI?

我自己弄清楚了:对于拥有数组并想要使用进度条和背景工作人员的每个人(可能会有更好的方法):

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++;
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM