为了账号安全,请及时绑定邮箱和手机立即绑定

C# Pogressbar 和后台工作者

C# Pogressbar 和后台工作者

C#
繁星淼淼 2021-11-21 14:52:49
单击按钮时,我的程序将执行以下操作: 程序将文件复制到临时文件夹并从临时文件夹中创建一个 zip 文件。被复制的文件的路径存储在一个数组中。只是为了让事情清楚:// "files" has stored the pathsprivate 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...        }}
查看完整描述

3 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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


例子:


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);

        }

    }

}


查看完整回答
反对 回复 2021-11-21
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

  1. MaximumProgressBar的属性设置为您的文件数。这样您就不必自己计算百分比。

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

  3. 在UI线程中复制文件并在后台线程中更新ProgressBar是没有意义的,如果真的花费太长时间,则应该相反。


查看完整回答
反对 回复 2021-11-21
?
千万里不及你

TA贡献1784条经验 获得超9个赞

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


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

        }

    }


查看完整回答
反对 回复 2021-11-21
  • 3 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信