BackgroundWorker не запускает событие RunWorkerCompleted - PullRequest
6 голосов
/ 13 июля 2011

Я создаю backgroundworker не в форме Windows, а в файле классов (BusinessLogic), который реализует всю обработку.Из основной формы я сначала вызываю метод BL, который инициализирует BGW.Затем я вызываю метод 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;             

    }

Ответы [ 2 ]

6 голосов
/ 13 июля 2011

Завершенное событие вызывается в главном потоке. Предполагается, что он будет подобран и выполнен MessagePump.

Однако ваш код ожидания и сна блокирует цикл обработки сообщений.

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

Ответ здесь заключается в том, что вы не используете фонового работника или другую форму потоков ...

Просто позвоните bgWorker_DoWork() напрямую:

 // Hide();
 bgWorker_DoWork();  // rename
 Show();  
0 голосов
/ 13 июля 2011

, если бы вы просто позвонили Application.DoEvents(); вместо Sleep(100);, ваш код работал бы, но, как я уже говорил ранее, класс BackgroundWorker является ошибкой, и я лично использовал бы свои собственные потоки и отчеты

Кроме того, вы можете немного поспать, а затем позвонить DoEvents

...