Смущен тем, что события BackgroundWorker не запускаются

StackOverflow https://stackoverflow.com/questions/231886

Вопрос

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

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

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

Форма1 выглядит так...

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 никогда не запускает ПрогрессИзменен событие.Если я заменю

Form1 form = new Form1();

с

OuterClass outerClass = new OuterClass()

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

Спасибо!

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

Это было полезно?

Решение

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

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

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

Другие советы

Ты на самом деле throw NotImplementedException(); в обработчике?или ты просто это быстро смоделировал и забыл удалить?

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top