Смущен тем, что BackgroundWorker не запускает события - PullRequest
2 голосов
/ 24 октября 2008

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

Хорошо, у меня есть консольное приложение, которое создает экземпляр WindowsForm и вызывает метод DoSomeWork () в форме.

class Program
  { 
    static void Main(string[] args)
    {
      Form1 form = new Form1();         
      form.DoSomeWork();   
    }
  }

Form1 выглядит так ...

public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    public void DoSomeWork()
    {
      OuterClass outerClass = new OuterClass();
      outerClass.DoSomeWork();
    }    
  }

Внешний класс, в свою очередь, выглядит так ...

public class OuterClass
  {
    public void DoSomeWork()
    {
      InnerClass innerClass = new InnerClass();
      innerClass.DoSomeWork();
    }
  }

И, наконец, InnerClass выглядит следующим образом ...

public class InnerClass
  {
    private BackgroundWorker _backgroundWorker = new BackgroundWorker();

    public InnerClass()
    {
      _backgroundWorker.WorkerReportsProgress = true;
      _backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
      _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged);
    }

    void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      int i = 0; //I've placed a break point here. But it's never hit
    }

    void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
      BackgroundWorker worker = sender as BackgroundWorker;

      worker.ReportProgress(42);
    }

    public void DoSomeWork()
    {
      _backgroundWorker.RunWorkerAsync();
    }
  }

По неизвестной (мне) причине BacgroundWorker в InnerClass, похоже, никогда не запускает событие ProgressChanged . Если я заменю

Form1 form = new Form1();

с

OuterClass outerClass = new OuterClass()

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

Спасибо!

РЕДАКТИРОВАТЬ: я, кажется, отбрасывал людей, оставляя обработчик события ProgressChanged как выбрасывающий NotImplementedException, поэтому я удалил его для ясности.

Ответы [ 2 ]

6 голосов
/ 24 октября 2008

Вы забыли запустить цикл обработки сообщений, требуется вызов Application.Run (). Без цикла сообщений события BackgroundWorker не могут работать. Исправить:

static void Main(string[] args)
{
  Application.Run(new Form1());   
}

Вызовите DoSomeWork () в конструкторе формы или в событии Load.

2 голосов
/ 24 октября 2008

Вы действительно throw NotImplementedException(); в обработчике? или ты просто издеваешься быстро и забыл его удалить?

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

Исходя из моего опыта, если поток с одним потоком не-пользовательский интерфейс создает исключение вне основного потока пользовательского интерфейса, этот поток просто умирает без предупреждения.

Для Windows Forms требуется модель квартиры, отличная от консольных приложений, если я правильно помню. Это может быть источником проблемы.

Я могу ошибаться, но это должно дать некоторые подсказки.

...