簡體   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