[英]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.