我有一个UI设计问题。
我想在非UI线程上遇到异常时退出应用程序。
基本上,事件是这样的:
主要表格 - >子WinForm的ShowDialog(MainThread) - >启动后台线程(WorkerThread) - >发生例外 - >显示ErrorForm(WorkerThread)
当用户单击ErrorForm上的“退出”按钮时,我想退出整个应用程序。但是,执行以下调用不起作用。
Invoker.Invoke((Action)(() => { Application.Exit(); }), null);
Invoker引用主窗体SynchronizedContext。但是,由于MainThread仍在等待subWinForm返回其控件,它可能无法处理Application.Exit()。
什么是更好的设计来处理后台工作线程抛出的异常?
答案 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
,不必要的括号和括号。我不认为它会阻止它正常工作,但无论如何,这样更容易阅读。