带有 MobileFirst 8.0 未处理异常错误的本机 Windows 10 客户端应用程序
Posted
技术标签:
【中文标题】带有 MobileFirst 8.0 未处理异常错误的本机 Windows 10 客户端应用程序【英文标题】:Native Windows 10 Client App with MobileFirst 8.0 Unhandled Exceptions Error 【发布时间】:2016-08-24 21:59:08 【问题描述】:我为客户开发原生 Windows 10 客户端 LOB 应用。 环境:Windows 10 Pro(在移动客户端/平板电脑和开发人员盒子上),带有更新 3 的 Visual Studio 2015 Professional,安装了所有更新和补丁。客户端应用程序使用最新的“IBM MobileFirst SDK for Windows 8 Universal and Windows 10 Universal platform”版本 8.0.2016070716
当应用程序在线并且可以访问 MobileFirst 8.0 服务器时,该应用程序运行良好。 如果无法访问服务器(离线、MFP 服务器已停止),我们会遇到客户端应用程序的应用程序崩溃。 从 MobileFirst C# 客户端库中启动的工作线程似乎引发了异常。这个异常不能包含在我的代码中。
这里有一些代码来演示这个问题:
private async Task<WorklightAccessToken> ConnectMobileFirst()
try
IWorklightClient _client = WorklightClient.CreateInstance();
WorklightAuthorizationManager _wlauthManager =
_client.AuthorizationManager;
WorklightAccessToken temp1 = await
_wlauthManager.ObtainAccessToken("");
return temp1;
catch (Exception exception)
Debug.WriteLine("Exception occured " + exception.Message);
return null;
创建一个新的空白应用程序并从 OnLaunched 事件处理程序中调用上述函数。
AccessToken = await ConnectMobileFirst();
if (AccessToken != null)
Debug.WriteLine(AccessToken.IsValidToken
? "Connection OK, AccessToken is valid"
: "AccesToken NOT valid");
如果可以访问 MobileFirst Server,一切都按预期工作,并且 AccessToken.IsValidToken 为 true。
如果 MobileFirst Server 处于脱机状态,则会发生以下情况:
函数ConnectMobileFirst()
结束,返回一个AccessToken对象(方法内部无异常)
AccessToken.IsValidToken 为 false(这是正确的,因为 MobileFirst 服务器处于脱机状态)。
有时在程序可以执行Debug.WriteLine
语句之前和有时之后,其他线程会遇到NullReferenceException。这个“其他”工作线程在 IBMMobileFirstPlatformFoundationWin10.dll 内的 ObtainAccessToken()
调用中的某处开始。 Visual Studio 中的“输出”窗口包含以下信息:
抛出异常:“System.Runtime.InteropServices.COMException”在 mscorlib.ni.dll WinRT 信息:Die Serververbindung konnte nicht hergestellt werden。
抛出异常:“System.Runtime.InteropServices.COMException”在 mscorlib.ni.dll WinRT 信息:Die Serververbindung konnte nicht hergestellt werden。
“MFPUnhandledExc1.exe”(CoreCLR:CoreCLR_UWP_Domain):已加载 'D:\VS2015Projects\MFPUnhandledExc1\bin\x86\Debug\AppX\System.Resources.ResourceManager.dll'。 模块是在没有符号的情况下构建的。抛出异常: System.Net.Http.dll 中的“System.Net.Http.HttpRequestException” 抛出异常:'System.Net.Http.HttpRequestException' mscorlib.ni.dll 抛出异常: System.Net.Http.dll 中的“System.Net.Http.HttpRequestException” 抛出异常:'System.Net.Http.HttpRequestException' mscorlib.ni.dll'MFPUnhandledExc1.exe'(CoreCLR:CoreCLR_UWP_Domain): 已加载 'D:\VS2015Projects\MFPUnhandledExc1\bin\x86\Debug\AppX\System.Runtime.InteropServices.dll'。 无法找到或打开 PDB 文件。抛出异常: mscorlib.ni.dll 异常中的“System.Net.Http.HttpRequestException” 抛出: System.Net.Requests.dll 异常中的“System.Net.WebException” 抛出:'System.NullReferenceException' IBMMobileFirstPlatformFoundationWin10.dll
如果您在ConnectMobileFirst()
调用之后的行上设置断点,您可以看到有一个工作线程仍然处于活动状态,其调用堆栈中有IBMMobileFirstPlatformFoundationWin10.dll。如果后端连接正常,则此线程不再存在。
这种行为不仅会在 MobileFirst Server 脱机的情况下出现,而且还会在服务器响应缓慢或网络缓慢且服务器响应很大的情况下出现。此外,这不仅是在连接期间,而且在WorklightResourceRequest.send()
期间也是如此。
我的问题:
如何防止这个杂散线程杀死我的应用程序? (短期解决方案) 为什么ObtainAccessToken()调用已经结束了还有工作线程? 为什么这个线程不处理它的异常?【问题讨论】:
【参考方案1】:这是在我们的客户端 SDK 代码中发现的一个错误。我们已在问题 https://www-304.ibm.com/support/entdocview.wss?uid=swg1PI68253 中修复它。
此修复程序将发布,并将在下一个 nuget 版本的 nuget 中提供。
【讨论】:
【参考方案2】:我可以做些什么来防止这个杂散线程杀死我的应用程序? 查看 Application.UnhandledException 事件,您可以通过以下链接在 MSDN 上找到相关文档。您可以在后面的 App.xaml.cs 代码中连接此事件。
通常在触发 UnhandledException 事件后,Windows 运行时会终止应用程序,因为该异常未处理。应用程序代码对此有一些控制:如果 UnhandledException 事件处理程序将事件参数的 Handled 属性设置为 true,那么在大多数情况下应用程序不会被终止。
https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.application.unhandledexception
关于您的其他问题,我认为您应该阅读这篇关于C# 或 Visual Basic 中的 Windows 运行时应用程序的异常处理的 MSDN 文章,这将有所帮助您了解应用程序中这些异常的情况。
https://msdn.microsoft.com/en-us/library/windows/apps/dn532194
【讨论】:
【参考方案3】:我们能够重现该问题,并且正在努力修复。我们会在新版 SDK 发布后进行更新。
【讨论】:
以上是关于带有 MobileFirst 8.0 未处理异常错误的本机 Windows 10 客户端应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如果设备离线,MobileFirst 8.0 C# WorklightResourceRequest.Send() 将挂起