[英]c# backgroundWorker not raising ProgressChanged or RunWorkerCompleted events
使用 C# .NET 3.5。
似乎我不是唯一一个,因为搜索似乎提出了很多类似的问题,但是通过它们阅读我似乎仍然缺少解决方案。
我正在通过单击我的 UI 上的按钮引发一个事件,然后应该启动一个 backgroundWorker 以完成一些耗时的工作 - 在这种情况下,我希望它从表单中收集信息并 a) 写入 xml文件以及 b) 将信息插入远程数据库。
我相信这正是 backgroundWorker 的设计和意图。
这是事件引发代码。
private void btnFinish_Click(object sender, EventArgs e)
{
clkFinish.setInstant();
curAct.setTimeFinish(DateTime.Now);
btnStart.Enabled = true;
bgwDataWorker.RunWorkerAsync();
for (int i = 0; i < 20; i++)
{
Console.WriteLine("Thread a: " + i);
Thread.Sleep(100);
if (i == (20 - 1))
{
Console.WriteLine("Finished");
}
}
}
如您所见,我在那里有一些代码用作后台工作人员代码的平衡,这里是:
private void bgwDataWorker_DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine("Running in a different thread now");
int count = 0;
for (int i = 0; i < 21; i++)
{
Console.WriteLine("Thread b: " + i);
Thread.Sleep(100);
(sender as BackgroundWorker).ReportProgress(5 * i, null);
if (i == (21 - 1))
{
count = i;
}
}
e.Result = count;
}
到目前为止,一切似乎都在进行中。
我的问题是,当 DoWork 方法中的代码完成后,什么也没有发生。 下面是 ProgressChanged 和 RunWorkerComplete 方法。
private void bgwDataWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Console.WriteLine(e.ProgressPercentage);
}
private void bgwDataWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("Result is " + e.Result.ToString());
}
这让我很困惑。
我尝试运行MSDN 中的示例,但遇到了同样的问题。 RunWorkerCompleted 和 ReportProgress 事件由于某种原因根本没有被引发,我不明白为什么。
谢谢阅读。
艾伦
你没有错过设置这些变量,是吗?
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
它也可能是 DoWork 方法中的一个例外,没有得到处理。
我有同样的问题,我只是想出了答案。
在 backgroundworker 的属性中,确保 ProgressChanged 和 RunWorkerCompleted 列出了它们的函数名称(我的分别称为“backgroundWorker1_ProgressChanged”和“backgroundWorker1_RunWorkerCompleted”)。
Inksmithy,您提到您已重命名 BackgroundWorker。 请注意,当您执行此操作时,Forms 设计器不会自动更改对旧 DoWork 和 RunWorkerCompleted 方法的引用。 因此,在您的 Forms 设计器中,单击 BackgroundWorker,然后单击属性 Window 中的事件图标(闪电),并仔细检查它是否指向正确的事件方法名称。
将WorkerReportsProgress
属性设置为 True。
我有一个项目 [A],(前一段时间建立)进度条正常工作。 当前应用 [B] 未报告进度。 出于某种原因,应用程序 [A] 连接了进度和工作完成事件处理程序。 所以,我在应用程序 [B] 中连接了事件处理程序,它正在工作。 处理程序被复制到 Designer.cs 部分 class 文件中。 (假设他们可以在 form.cs 部分类中使用 go)。
//
// backgroundWorker1
//
this.backgroundWorker1.WorkerReportsProgress = true;
this.backgroundWorker1.WorkerSupportsCancellation = true;
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
//
希望这可以帮助。 不知道为什么应用程序 [A] 是通过使用工具箱将后台工作人员放置在表单设计 window 上来连接的。 使用 VS2012 和 Windows 7.
另外,我正在计算进度百分比,由于某种原因,列表框中的项目数乘以选定复选框的数量超过 100% - 它抛出并出错。 因此,我将百分比限制在 99,并将这部分作为我的逻辑,以便将进度百分比报告回事件。
我最近有这个问题。 这是因为我让主线程休眠直到后台线程完成,这阻止了更新的执行。
我通过将我的 object(包含工作线程)包装到另一个线程中解决了这个问题,以便可以执行进度更新,更改主线程中的值允许我的睡眠线程继续。
你遗漏了一个重要的部分 - 一个 boolean 标志,允许它引发事件
bgwDataWorker.WorkerReportsProgress = true;
bgwDataWorker.WorkerSupportsCancellation = true;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.