我编写了一个简单的应用程序,使用 BackgroundWorker 将 100000 行“Hello World”添加到列表中。
下面是我的 backgroundworker 在一个单独的线程中所做的工作的代码:
private void BgWorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
int min = 0;
foreach (var hw in hwList)
{
//new ManualResetEvent(false).WaitOne(1);
Thread.Sleep(1);
int progress = Convert.ToInt32((Double)min / hwList.Count * 100);
min++;
bgWorker.ReportProgress(progress);
}
}
// Updating the progress
private void BgWorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
{
ProgressBar.Value = progressChangedEventArgs.ProgressPercentage;
}
一切正常,除了如果我删除 Thread.Sleep(1) BackgroundWorker 不再报告进度。 (我想这需要一些时间)。将线程挂起 1 毫秒实际上会使 BackgroundWorker 报告进度,但速度非常慢。
我的问题是,有没有一种方法可以摆脱线程休眠,同时让 BackgroundWorker 正确报告进度?
根据我的理解,暂停 BackgroundWorker 是不可避免的,因为线程需要一些时间来执行任务,但我想知道是否有解决方法。
最佳答案
我遇到了经常报告进度的问题,而且没有理由多次报告相同的进度浪费 CPU 周期。
private void BgWorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
int min = 0;
int oldProgress = 0;
foreach (var hw in hwList)
{
// new ManualResetEvent(false).WaitOne(1);
// Thread.Sleep(1);
int progress = Convert.ToInt32((Double)min / hwList.Count * 100);
min++;
// Only report progress when it changes
if(progress != oldProgress){
bgWorker.ReportProgress(progress);
oldProgress = progress;
}
}
}
// Updating the progress
private void BgWorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
{
ProgressBar.Value = progressChangedEventArgs.ProgressPercentage;
}
关于c# - 线程在 BackgroundWorker 中休眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30765897/