如何在非UI线程上调用Application.Exit

时间:2011-07-28 23:01:19

标签: c# winforms user-interface

我有一个UI设计问题。

我想在非UI线程上遇到异常时退出应用程序。

基本上,事件是这样的:

主要表格 - >子WinForm的ShowDialog(MainThread) - >启动后台线程(WorkerThread) - >发生例外 - >显示ErrorForm(WorkerThread)

当用户单击ErrorForm上的“退出”按钮时,我想退出整个应用程序。但是,执行以下调用不起作用。

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

Invoker引用主窗体SynchronizedContext。但是,由于MainThread仍在等待subWinForm返回其控件,它可能无法处理Application.Exit()。

什么是更好的设计来处理后台工作线程抛出的异常?

2 个答案:

答案 0 :(得分:2)

Cancel the background worker并向BackgroundWorker RunWorkerCompletedEvent发送一个参数,以确定是否存在异常。在那之后调用Application.Exit()就可以了。

答案 1 :(得分:1)

我知道像这样调用可以在Silverlight中使用:

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

或者如果你的WinForms类没有Dispatcher

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

您有许多额外的不必要代码((Action)null,不必要的括号和括号。我不认为它会阻止它正常工作,但无论如何,这样更容易阅读。