在我的WP8应用程序中,我使用所有传感器。 Accelerometer,Compass(来自Windows.Devices.Sensors和来自Microsoft.Devices.Sensors)和Inclinometer。 一切正常,直到我按 Windows 按钮,然后按后退按钮。 我得到了一个完整的黑屏,其中包含“Resuming ...”消息,没有任何反应。一旦我得到例外(仅从5岁开始):
{System.Runtime.InteropServices.SEHException: External component has thrown an exception.
at Microsoft.Devices.Sensors.SensorBase`1.PauseSensor()
at Microsoft.Devices.Sensors.SensorBase`1.<>c__DisplayClass7.<.ctor>b__4(Object sender, NotificationCallbackEventArgs args)
at Microsoft.Devices.Sensors.SensorCallback.MS.Internal.Interop.INotificationCallback.Pausing(XPauseType pauseType)
at MS.Internal.Interop.NotificationService.NotificationPausing(XPauseType pauseType)
at MS.Internal.FrameworkCallbacks.NotificationPausing(UInt32 pauseType)}
有人见过这个例外吗?
或者在wp8应用程序生命周期中是否有最佳的传感器正常工作?
由于
答案 0 :(得分:3)
这个问题比我想象的要复杂得多。我已经做了很多工作。我分享我发现的东西,因为我认为我的经历也可以帮助其他人。
我通过服务类使用传感器:这些类更新我的VM,在VM中我使用DispatcherHelper在UI上更新这些类。我知道是否要更新传感器的valuechanged事件中的UI绑定属性我需要在eventhandler中使用dispatcherhelper调用此更新,但我不知道的是,如果他们与VM而不是Views进行通信,他们的行为方式。当我启动应用程序时,如果传感器具有新值,我在更新UI时没有任何问题。我唯一的问题是在这种情况下,如果我想停用(按下Windows按钮)并激活(按下后退按钮)我的应用程序,我也没有例外,我没有丢失我的调试会话但只有一个黑色页面“恢复...“文本和正在运行的进度条,没有任何反应。
我错过的是一个crossthread / access异常。如果我使用UI绑定数据执行此操作,则会抛出异常但在这种情况下它不会。
另一件事:加速度计(我的版本只与加速度计配合使用)可以与仿真器配合使用,但在设备上却没有。我认为模拟器试图通过返回值来模拟加速器,但不是以正确的方式(没有线程问题)。
<强>解决方案强>
如果我在UI线程上的事件处理程序内更新(使用我自己的DispatcherHelper),一切正常。这是一个很好的经验教训,在与传感器和其他层/线程(VM,V)交互时要始终注意。
答案 1 :(得分:1)
听起来像生命周期问题。
您是否尝试在App.Deactivated事件上的Microsoft.Devices.Sensors上的传感器上调用SensorBase.Stop()并在App.Activated事件上使用SensorBase.Start()重新启动?根据您的应用中需要传感器访问的页数,您甚至可以覆盖OnNavigatedTo / OnNavigatedFrom方法并使用它们。
您不应该这样做,但根据您的应用程序,这可能是个好主意。 (您的应用是否支持锁定屏幕空闲执行?它是否具有后台代理?它是否尝试在后台运行时获取传感器读数?)