【发布时间】:2013-10-17 23:11:34
【问题描述】:
我在表单中创建了一个后台工作进程..
BackgroundWorker bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
另外,我在表单中有一个进度条控件(进度条最小值和最大值分别为 1 和 100)。
在我的按钮点击中,
点击事件将触发应该在后台并行运行的实际方法调用,开始显示进度条步骤......
if (bw.IsBusy)
{
return;
}
bw.DoWork += (bwSender, bwArg) =>
{
MethodCall1(); - Does some database insertions..
MethodCall2(); - Does some database select...
}
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += (bwSender, bwArg) =>
{
bw.Dispose();
};
bw.RunWorkerAsync();
让进度条显示进度...
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
我面临的问题是,进度条没有步进,它静止不动,没有进度条的进度。
我也尝试在我的实际方法中插入 bw.ReportProgress(integervalue),但是没有帮助。
如何让backgroundworker线程处理方法调用并并行显示进度条的进度,方法调用完成后,我想结束进度条步骤。
【问题讨论】:
-
如果在 bw_ProgressChanged 中设置断点,是否达到? e.ProgressPercentage 是否具有您期望的值?与 e.ProgressPercentage 中的值相比,progressBar 的最小/最大值是多少?
-
显然您的代码缺少所需的 ReportProgress() 调用,因此进度条不会移动。根本不可能计算出有意义的进度值,您并不总是足够了解 dbase 引擎在做什么。唯一的选择是使用 ProgressBar.Style = Marquee。 “努力工作,而不是死”选项。
-
如果我将进度条样式设置为选取框,我可以看到进度条,但是当我将其更改为块时,我看不到进度条的进度。
-
您应该只连接一次事件,例如在构造函数或表单的 Load() 事件中。另外,如果你对 BackgroundWorker 进行 Dispose(),下次单击按钮时它将如何再次运行?在您的 MethodCall1() 和 MethodCall2() 方法中,您是否偶然声明了一个名为“bw”的本地 BackgroundWorker()?
-
不知道 BGWorker 但通常语法
object.event += () => {}被认为是泄漏的。一个好方法是先声明变量:var handler = () => {}。然后是object.event += handler;,然后是object.event -= handler;
标签: c# .net winforms progress-bar backgroundworker