Windows Phone 处理 MessageBox导致的应用异常退出以及使用代码方式退出应用
2013-05-23 15:55
489 查看
看到题目可能有些同学觉得这是一个老生常谈的问题了,确实这是一个 known issue 但我发现还是有同学在询问这个问题,所以在这里给大家总结分享一下。
首先第一个问题 MessageBox显示出来以后,如果用户不理会 Message 页面,大概等上10秒钟程序就会自动退出。(这个现象在Debug时不会出现)
先简单分析一下这个问题的原因,首先为什么在Debug的时候应用不会出问题,很简单我们在调试应用的时候很有可能一个断点停留10秒钟以上(一个返回值阻塞主线程),然而应用在非Debug的情况下出现这种现象,SDK会认为你的代码有问题会强制退出。
其实解决这个问题的方法很简单,既然知道这个问题的原因了,使用一个异步方法(线程)来实解决这个问题。
![](http://images.cnitblog.com/blog/33251/201305/23155437-d49b4aa57d4742d3b076c2b5172c3855.png)
当然肯定有同学会问 在调用MessageBox之前先把 e.Cancel 设置成 True 了那怎么退出应用呢? 这也算是一个老问题了(WP7时代遗留问题),这里我也是总结一下经验,从网上看到的一些方法。
Windows Phone 8 更新 此方法可以直接终结应用。
但是此方法这里不会调用页面的 OnNavigatedFrom 事件 和App中的Application_Closing 事件,所以在调用此方法前要注意保存用户数据。
![](http://images.cnitblog.com/blog/33251/201305/23171458-7506f74b46fb4842a20754694a82288b.png)
Windows Phone 7
首先 XNA中的Game.Exit() 不建议使用因为在应用商店审核的时候会遇到问题,导致不能上商店。
目前唯一的靠谱方法就是通过抛异常并且在App文件中的Application_UnhandledException事件中处理它:
网络上抛出异常的方式有两种
1. 自定义的异常
最后使用App.Quit()退出应用。
2. 利用 NavigationService.GoBack();退出应用
同理,在 Application_UnhandledException 中处理一下这个异常。
![](http://images.cnitblog.com/blog/33251/201305/23155439-75c8c03a403648628af8d42f04593ca8.png)
首先第一个问题 MessageBox显示出来以后,如果用户不理会 Message 页面,大概等上10秒钟程序就会自动退出。(这个现象在Debug时不会出现)
先简单分析一下这个问题的原因,首先为什么在Debug的时候应用不会出问题,很简单我们在调试应用的时候很有可能一个断点停留10秒钟以上(一个返回值阻塞主线程),然而应用在非Debug的情况下出现这种现象,SDK会认为你的代码有问题会强制退出。
其实解决这个问题的方法很简单,既然知道这个问题的原因了,使用一个异步方法(线程)来实解决这个问题。
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { e.Cancel = true; base.OnBackKeyPress(e); this.Dispatcher.BeginInvoke(delegate { if (MessageBox.Show("是否要退出程序?", "退出", MessageBoxButton.OKCancel) == MessageBoxResult.OK) { } }); }
![](http://images.cnitblog.com/blog/33251/201305/23155437-d49b4aa57d4742d3b076c2b5172c3855.png)
当然肯定有同学会问 在调用MessageBox之前先把 e.Cancel 设置成 True 了那怎么退出应用呢? 这也算是一个老问题了(WP7时代遗留问题),这里我也是总结一下经验,从网上看到的一些方法。
Windows Phone 8 更新 此方法可以直接终结应用。
Application.Current.Terminate();
但是此方法这里不会调用页面的 OnNavigatedFrom 事件 和App中的Application_Closing 事件,所以在调用此方法前要注意保存用户数据。
![](http://images.cnitblog.com/blog/33251/201305/23171458-7506f74b46fb4842a20754694a82288b.png)
Windows Phone 7
首先 XNA中的Game.Exit() 不建议使用因为在应用商店审核的时候会遇到问题,导致不能上商店。
目前唯一的靠谱方法就是通过抛异常并且在App文件中的Application_UnhandledException事件中处理它:
网络上抛出异常的方式有两种
1. 自定义的异常
private class QuitException : Exception { } public static void Quit() { throw new QuitException(); } // Code to execute on Unhandled Exceptions private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) { if (e.ExceptionObject is QuitException) return; if (System.Diagnostics.Debugger.IsAttached) { // An unhandled exception has occurred; break into the debugger System.Diagnostics.Debugger.Break(); } }
最后使用App.Quit()退出应用。
2. 利用 NavigationService.GoBack();退出应用
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { e.Cancel = true; base.OnBackKeyPress(e); this.Dispatcher.BeginInvoke(delegate { if (MessageBox.Show("是否要退出程序?", "退出", MessageBoxButton.OKCancel) == MessageBoxResult.OK) { while (NavigationService.BackStack.Any()) { NavigationService.RemoveBackEntry(); } NavigationService.GoBack(); } }); }
同理,在 Application_UnhandledException 中处理一下这个异常。
![](http://images.cnitblog.com/blog/33251/201305/23155439-75c8c03a403648628af8d42f04593ca8.png)
相关文章推荐
- Windows Phone 处理 MessageBox导致的应用异常退出以及使用代码方式退出应用 推荐
- 简单明了地解释JMS , 相关概念 ,以及JMS的实例代码下载 ,传统使用方式(非Spring框架下的集成)
- .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
- Android使用Java代码设置selector或drawable,以及使用自定义控件方式使用它
- GitLab的一键安装方式以及使用Git工具上传代码
- s捕捉异常处理是使用js try catch方式
- 使用HttpsUrlConnedtion连接https地址时异常处理 (方式二)
- 使用HttpsUrlConnedtion连接https地址时异常处理 (方式二)
- python3爬虫(8):异常处理以及代理的使用
- 使用try-with-resource改进代码异常处理机制
- 黑马程序员_JAVA中常见的异常以及处理方式(课堂笔记)
- @RequiresPermissions 控制权限的异常处理以及Ajax方式请求时返回json
- 在C#代码中应用Log4Net(二)典型的使用方式
- 异常解析家族应用点源码讲解:SpringMVC全局异常捕获及SpringMVC文件上传报错的优雅解决方式以及@Exception拦截异常注意点
- iOS代码方式退出应用
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积
- MVC过滤器使用案例:统一处理异常顺道精简代码
- 在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
- 菜鸟学android——配置更改导致应用异常的处理方案
- CocoaPods使用异常及处理方式