如何在非UI线程上调用Application.Exit
我有一个UI设计问题。
我想在非UI线程上遇到exception时退出应用程序。
基本上,事件是这样的:
主窗体 – >子WinForm的ShowDialog(MainThread) – >启动后台线程(WorkerThread) – >发生exception – >显示ErrorForm(WorkerThread)
当用户单击ErrorForm上的退出按钮时,我想退出整个应用程序。 但是,执行以下调用不起作用。
Invoker.Invoke((Action)(() => { Application.Exit(); }), null);
Invoker引用主窗体SynchronizedContext。 但是,由于MainThread仍在等待subWinForm返回其控件,因此它可能无法处理Application.Exit()。
什么是更好的设计来处理后台工作线程抛出的exception?
取消后台工作程序并向BackgroundWorker RunWorkerCompletedEvent发送参数以确定存在exception。 之后调用Application.Exit()
就可以了。
我知道这样的调用在Silverlight中有效:
Dispatcher.BeginInvoke(() => Application.Exit());
或者,如果WinForms类没有Dispatcher
:
Invoker.BeginInvoke(() => Application.Exit());
你有很多额外的不必要的代码( (Action)
, null
,不必要的括号和括号)。 我不认为它会阻止它正常工作,但无论如何,这样更容易阅读。