Как вызвать Application.Exit в потоке без пользовательского интерфейса - PullRequest
1 голос
/ 29 июля 2011

У меня есть вопрос о дизайне пользовательского интерфейса.

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

По сути, событие выглядит так:

Основная форма -> ShowDialog для подпроцесса WinForm (MainThread) -> Запуск фонового потока (WorkerThread) -> Возникновение исключения -> Отображение ErrorForm (WorkerThread)

Когда пользователь нажимает кнопку «Выход» наErrorForm, я хочу выйти из всего приложения.Однако выполнение следующего вызова не работает.

Invoker.Invoke((Action)(() => { Application.Exit(); }), null);

Ссылка Invoker на главную форму SynchronizedContext.Однако, так как MainThread все еще ожидает, пока subWinForm вернет свой элемент управления, он, вероятно, не сможет обработать Application.Exit ().

Что может быть лучше для обработки исключения, которое выбрасывается фономрабочий поток?

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Отмена фонового рабочего и отправка аргумента в BackgroundWorker RunWorkerCompletedEvent, чтобы определить наличие исключения.После этого звоните Application.Exit() оттуда будет нормально.

1 голос
/ 29 июля 2011

Я знаю, что подобное обращение работает в Silverlight:

Dispatcher.BeginInvoke(() => Application.Exit());

Или, если нет Dispatcher для ваших классов WinForms:

Invoker.BeginInvoke(() => Application.Exit());

У вас было много лишнего ненужного кода ((Action), null, ненужные скобки и скобки). Я не думаю, что это помешало бы его правильной работе, но в любом случае так легче читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...