繁体   English   中英

c# backgroundWorker 未引发 ProgressChanged 或 RunWorkerCompleted 事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM