如何在非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 ,不必要的括号和括号)。 我不认为它会阻止它正常工作,但无论如何,这样更容易阅读。