Смущен тем, что события BackgroundWorker не запускаются
-
04-07-2019 - |
Вопрос
Это может показаться несколько надуманным примером, но я чешу затылок.
Хорошо, у меня есть консольное приложение, которое создает экземпляр 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 требуется другая модель квартиры, чем для консольных приложений.Это может быть источником проблемы.
Я могу ошибаться, но это должно дать некоторые указания.