使用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());

}
这让我感到困惑。
我尝试运行examples from MSDN,但遇到了同样的问题。出于某些原因,根本没有引发RunWorkerCompleted和ReportProgress事件,我也不知道为什么。
谢谢阅读。
艾伦

最佳答案

我有同样的问题,我只是想出了答案。

在backgroundworker的属性中,请确保ProgressChanged和RunWorkerCompleted列出了它们的函数的名称(我的名字分别称为“backgroundWorker1_ProgressChanged”和“backgroundWorker1_RunWorkerCompleted”)。

关于C#backgroundWorker没有引发ProgressChanged或RunWorkerCompleted事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6108485/

10-13 06:08