try
{
........
}
catch {
Application.Current.Shutdown();
}
有上面这句代码,在catch 语句中退出应用程序,可是,当出现异常的时候,为什么程序没有退出呢?(已确定执行了catch 语句,并且试了一下在try...catch 语句之外执行Application.Current.Shutdown();,应用程序是能正常关闭的)
------解决思路----------------------
一般跟线程有关。有两种可能:
一、从工作线程中调用Application.Current.Shutdown有误。
只能从‘主’线程调用Application.Current.Shutdown,以下是MSDN的中文参考(MSDN机器翻译很烂):
[quote 引用:https://msdn.microsoft.com/zh-cn/library/ms597013(v=vs.110).aspx]
Application.Shutdown 方法
...
此方法可以从创建 Application 对象的线程仅调用。
因此,如下代码不能退出程序,因为Shutdown在非UI线程中调用,本身将抛出了异常:
private void Button1_Click(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
Application.Current.Shutdown();
});
}
而如下的代码则可以正常工作,因为Dispatcher把调用放到UI线程上去运行:
private void Button2_Click(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
Dispatcher.BeginInvoke((Action)Application.Current.Shutdown);
});
}
二、另外一种可能是界面退出了,但由于还有线程没有退出,程序不能关闭。
这种情形往往出现在自己显式创建线程的时候,比如用
Thread thread = new Thread(...);
thread.Start();
由于thread没有标记被Background Thread,它结束了,进程才能 退出。
把线程标记为后台线程,它就不会阻碍进程退出:
thread.IsBackground = true;
thread.Start();
------解决思路----------------------
你在 Application.Current.Shutdown(); 这个代码处,设置一个断点,当这句执行后,看看有没有线程没有退出,然后再去找这个线程里面的代表。创建线程的时候,给线程的Name 取一个名字。
------解决思路----------------------
在Finally 中执行
------解决思路----------------------
写了一个测试代码,关闭被执行了啊
try
{
throw new Exception("");
}
catch
{
Application.Current.Shutdown();
}
------解决思路----------------------
你断点调试一下catch里的代码,看有没有执行到Application.Current.Shutdown();
------解决思路----------------------
确保在 UI 主线程执行它。
------解决思路----------------------
这应该是 异常 “阻塞”了 关闭的执行,你可以使用 Dispatcher的Invoke方法 执行关闭语句测试。
------解决思路----------------------
1.确保你在UI线程调用它,如果是工作线程,请使用委托
2.确保你调用了它之后,没有再使用messagebox等阻塞代码阻塞住主线程的执行