BackgroundWorker不会触发RunWorkerCompleted事件

时间:2011-07-13 09:25:52

标签: c# .net backgroundworker

我正在创建不在我的Windows窗体中的后台工作程序,而是在实现所有处理的类文件(BusinessLogic)中。从主窗体我首先调用初始化BGW的BL方法。然后我调用BL的方法来启动BGW。

这是我的实现的更多背景:)。 How to use BackGroundWorker in class file?

DoWork事件运行正常,但它不会调用RunWorkerCompleted。

一些谷歌搜索,我发现了这个链接。我觉得我的问题与这些家伙一样。 http://www.eggheadcafe.com/software/aspnet/29191764/backgroundworker-does-not-fire-the-runworkercompleted-event.aspx

我对此问题的任何意见表示感谢。提前谢谢。

主要形式的代码:

    private void frmMain_Load(object sender, EventArgs e)
    {
      Hide();
      BusinessLogic.BGWInitialize();
      BusinessLogic.StartBackgroundWorker();                
      while (!BusinessLogic.firstCycleDone)
      {
        Thread.Sleep(100);
      }
      Show();            
    }        

BusinessLogic中的代码:

    public static void BGWInitialize()
    {
        bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
        bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
        bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
        bgWorker.WorkerReportsProgress = true;
    }

    public static void StartBackgroundWorker()
    { 
        bgWorker.RunWorkerAsync();
    }


    private static void bgWorker_RunWorkerCompleted(
        object sender, RunWorkerCompletedEventArgs e)
    {            
        firstCycleDone = true;             

    }

2 个答案:

答案 0 :(得分:6)

已完成的事件被调用到主线程。它应该被MessagePump拾取并执行。

但是,您的等待和睡眠代码阻止了消息循环。

  Hide();
  ....
  while (!BusinessLogic.firstCycleDone)
  {
    Thread.Sleep(100);
  }
  Show();

这里的答案是你没有使用Backgroundworker或其他形式的线程......

直接致电bgWorker_DoWork()

 // Hide();
 bgWorker_DoWork();  // rename
 Show();  

答案 1 :(得分:-1)

如果您只是致电Application.DoEvents();而不是Sleep(100);,那么您的代码就可以正常运行,但正如我之前所说BackgroundWorker类是一个有缺陷的东西,我会亲自使用自己的线程和报告

或者你可以睡一会儿,然后拨打DoEvents