【发布时间】:2015-06-10 19:46:24
【问题描述】:
我编写了一个简单的应用程序,它使用 BackgroundWorker 将 100000 行“Hello World”添加到列表中。
下面是我的后台工作人员在一个单独的线程中所做的工作的代码:
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 是不可避免的,因为线程需要一些时间来执行任务,但我想知道是否有解决方法。
【问题讨论】:
-
是什么让您认为它在快速/不睡觉时没有报告进度?
-
这段代码在做什么?它看起来像一个非常简单的 for 循环 - 报告进度可能比循环的其余部分要昂贵得多。
-
“BackgroundWorker 不再报告进度”您能否详细说明此声明?我相信它仍然会报告,你不只是正确地使用它。
-
那么这是一个完全不同的问题。也许它发生得太快而无法看到?它最终满了吗?我们需要查看代码才能知道那里发生了什么。
-
@deefrson 由于进度是一个整数,因此您不会看到 2,000,000 循环的第 1 次和第 10,000 次迭代之间有任何区别。两者都是 0。
标签: c# wpf multithreading backgroundworker thread-sleep