是什么导致调用RunWorkerCompleted?

时间:2012-06-27 01:44:36

标签: c# winforms backgroundworker

我有一个winforms系统托盘应用程序,它通过数据库监视作业状态。我点击系统托盘,打开当前活动作业的菜单,如果我点击一个作业,我会创建一个应该显示消息和进度条的表单。

表单的构造函数是

    public JobStatusForm()
    {
        InitializeComponent();

        activeJobsBGWorker = new BackgroundWorker();
        activeJobsBGWorker.DoWork += new DoWorkEventHandler(activeJobsBGWorker_DoWork);
        activeJobsBGWorker.ProgressChanged += new ProgressChangedEventHandler(activeJobsBGWorker_ProgressChanged);
        activeJobsBGWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(activeJobsBGWorker_RunWorkerCompleted);
    }

然后,上下文方法的click事件处理程序调用JobStatusForm.Show()。在表格中,我有:

    private void JobStatusForm_Shown(object sender, EventArgs e)
    {
        activeJobsBGWorker.RunWorkerAsync();
    }

启动工人。

我发现工作人员启动,然后引发了RunWorkerCompleted事件。发件人是后台工作者,事件args为空。

如何找出引发此事件的内容,以及如何停止/重启?

谢谢,

编辑:

目前,Do_Work代码如下所示:

private void activeJobsBGWorker_DoWork(object sender, DoWorkEventArgs e)
    {

        //while (!e.Cancel)
        while (true)
        {
            _clr.JobStatus status = _clr.SystemDataHelper.GetCurrentJobActivity(_clr.SystemDataHelper.GetLocation(), this.job_ID);

            //if (activeJobsBGWorker.CancellationPending)
            //    continue;

            activeJobsBGWorker.ReportProgress(status.pc, status);

            Thread.Sleep(250);
        }
    }

我在ReportProgress行上设置了一个断点,它永远不会被命中。

对_clr的调用是作为dll构建的C ++项目,并调用一个调用数据库的静态方法。

1 个答案:

答案 0 :(得分:3)

Do_Work方法中的异常也会导致RunWorkerCompleted被触发。