后台工作人员';s的RunWorkerCompleted事件甚至在完成工作之前就已启动

本文关键字:工作 启动 工作人员 事件 RunWorkerCompleted 后台 | 更新日期: 2023-09-27 18:25:17

我正在使用BackgroundWorker线程执行一项长任务(基本上是读取一个大的xml文件)。这是第一次工作人员按要求正常工作,但如果我上传第二个xml文件,使用同一个后台工作人员,它有时工作得很好,但大多数情况下,Backgroundworker的RunWorkerCompleted甚至在DoWork事件之前就被激发了。部分代码显示在下方

    private void openFile_Click(object sender, RoutedEventArgs e)
    {
          // Code removed for brevity
  worker = new BackgroundWorker();
            worker.RunWorkerAsync();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.WorkerReportsProgress = true;
            worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
       }
        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        DataImport();
        //worker.Dispose();
        //worker.Disposed += new EventHandler(worker_Disposed);
        //worker.DoWork -= worker_DoWork;
        //worker.RunWorkerCompleted -= worker_RunWorkerCompleted;
        //worker = null;
        //GC.Collect(GC.GetGeneration(worker), GCCollectionMode.Forced);
    }

worker是一个全局定义的变量。我不明白这里出了什么问题。请帮助

后台工作人员';s的RunWorkerCompleted事件甚至在完成工作之前就已启动

您应该在调用RunWorkerAsync()之前添加DoWork-事件处理程序(以及所有其他事件处理程序)

否则,可能发生RunWorkerAsync实际上什么都不做的情况。

应该是这样的:

worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += 
    new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += 
    new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();

应该在订阅DoWorkRunWokerCompleted事件之后调用RunWorkerAsync

您应该首先检查后台工作人员是否繁忙,使用这个。。。。

        backgroundWorker1.DoWork += backgroundWorker1_DoWork;
        backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
        if (backgroundWorker1.IsBusy)
        {
            backgroundWorker1.CancelAsync();
        }
        else
        {
            backgroundWorker1.RunWorkerAsync();
        }

如中所述https://stackoverflow.com/a/16809596/8029935,当DoWork方法因异常而死亡时,您可以盲目地假设工作人员已经完成了工作并产生了结果。它被BackgroundWorker捕获,并作为e.Error属性传递给RunWorkerCompleted事件处理程序。

因此,我建议您必须使用try/catch语句检查该属性。

如果在BackgroundWorker_DoWork事件中调用另一个异步函数,

喜欢;

    private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        somethingsToDoAsync();
        // somethingsToDoAsync() function is to ASYNC 
    }

_RunWorkerCompleted甚至在完成_Dowork事件之前就触发了。

将另一个函数更改为非异步。