[英]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);
}
}
}
將ProgressBar的Maximum
屬性設置為您的文件數。 這樣,您不必自己計算百分比。
在復制文件的循環中,只需增加ProgressBar的Value
屬性即可。
復制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.