C# 在 BackGroundWorker 中运行一个方法并显示 ProgressBar
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13874122/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Running a method in BackGroundWorker and Showing ProgressBar
提问by soham
What I want is when some method is doing some task UI keeps itself active and I want to show the progress of the work in a progress-bar.
我想要的是当某些方法正在执行某些任务时 UI 保持自身处于活动状态,并且我想在进度条中显示工作进度。
I have a method, a BackGroundWorkerand a Progressbar. I want to call the method when BackGroundWorkerstarts running and show the progress. The method contains a loop. So, it can report the progress.
我有一个方法, aBackGroundWorker和 a Progressbar。我想在BackGroundWorker开始运行时调用该方法并显示进度。该方法包含一个循环。因此,它可以报告进度。
So, what can be done?
那么,有什么办法呢?
private void Form1_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'dataSet1.TBLMARKET' table. You can move, or remove it, as needed.
myBGWorker.WorkerReportsProgress = true;
}
private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
{
parseFiles();
}
private void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
myProgressBar.Value = e.ProgressPercentage;
}
private void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Done");
}
private void parseButton_Click(object sender, EventArgs e)
{
myBGWorker.RunWorkerAsync();
}
public void parseFiles()
{
for()
{
//parsing
myBGWorker.ReportProgress(...);
}
}
But it's not working. The Progressbaris not updating. Only a small progress is showing after the MessageBox"Done".
但它不起作用。在Progressbar没有更新。MessageBox“完成”后只显示一个小的进展。
采纳答案by Sergey Berezovskiy
Instead of using one ParseFiles method (which should depend on myBGWorker) use loop and method which parse one file. Report progress percentage in that loop:
而不是使用一种 ParseFiles 方法(应该依赖于 myBGWorker),而是使用解析一个文件的循环和方法。报告该循环中的进度百分比:
private void parseButton_Click(object sender, EventArgs e)
{
parseButton.Enabled = false;
myBGWorker.RunWorkerAsync();
}
private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 0; i < filesCount; i++)
{
ParseSingleFile(); // pass filename here
int percentage = (i + 1) * 100 / filesCount;
myBGWorker.ReportProgress(percentage);
}
}
void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
myProgressBar.Value = e.ProgressPercentage;
}
void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
parseButton.Enabled = true;
MessageBox.Show("Done");
}
回答by soham
I am sorry about the question. Actually the code works fine. It was not showing the Progressbaras the argument in myBGWorker.ReportProgress()was fraction and not percentage. So, it was not showing it. Sorry for the inconvenience.
我很抱歉这个问题。实际上代码工作正常。它没有显示 ,Progressbar因为参数myBGWorker.ReportProgress()是分数而不是百分比。所以,它没有表现出来。带来不便敬请谅解。
Moderator may delete this thread. Otherwise it can be a tutorial for others.
版主可以删除这个帖子。否则,它可以成为其他人的教程。
回答by Namo
To. soham.m17 using with sender argument
到。soham.m17 与发件人参数一起使用
private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
for(int i = 0; i < filesCount; i++)
{
ParseSingleFile(); // pass filename here
int percentage = (i + 1) * 100 / filesCount;
worker.ReportProgress(percentage); // use not myBGWorker but worker from sender
}
}

