BackgroundWorker不会触发RunWorkerCompleted事件

Arc*_*rus 7 .net c# backgroundworker

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

这是我的实现更多背景:). 如何在类文件中使用BackGroundWorker?

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();            
    }        
Run Code Online (Sandbox Code Playgroud)

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;             

    }
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 6

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

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

  Hide();
  ....
  while (!BusinessLogic.firstCycleDone)
  {
    Thread.Sleep(100);
  }
  Show();
Run Code Online (Sandbox Code Playgroud)

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

bgWorker_DoWork()直接打电话:

 // Hide();
 bgWorker_DoWork();  // rename
 Show();  
Run Code Online (Sandbox Code Playgroud)