BackgroundWorker不会触发RunWorkerCompleted事件

本文关键字:RunWorkerCompleted 事件 BackgroundWorker | 更新日期: 2023-09-27 18:02:34

我正在创建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();            
    }        

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;             
    }

BackgroundWorker不会触发RunWorkerCompleted事件

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

但是,Wait-and-Sleep代码阻塞了消息循环。
  Hide();
  ....
  while (!BusinessLogic.firstCycleDone)
  {
    Thread.Sleep(100);
  }
  Show();

这里的答案是,你没有使用后台工作者或其他形式的线程…

直接调用bgWorker_DoWork():

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

如果你只是调用Application.DoEvents();而不是Sleep(100);你的代码将工作,但正如我之前说的BackgroundWorker类是一个有bug的东西,我会亲自使用我自己的线程和报告

或者你可以睡一会儿,然后调用DoEvents

相关文章:
  • 没有找到相关文章