【问题标题】:How can I simulate Microsoft Surface tear-down timeout?如何模拟 Microsoft Surface 拆卸超时?
【发布时间】:2025-12-28 11:45:06
【问题描述】:

我一直在为 Windows 8 开发应用程序,并且可以从 Visual Studio 2012 测试暂停、恢复、关闭等。但是,当我在 Microsoft Surface 上测试应用程序时,还有另一种状态我不能似乎在模拟。

当应用程序打开并且您暂时不触碰 Surface 时,屏幕会变暗,然后最终关闭。如果我等待的时间足够长,可能是 1 或 2 分钟,然后点击开始按钮,它会将我带到我可以登录的锁定屏幕。一旦我登录,它会显示我的应用程序离开它的位置。但是,1 秒后,它立即崩溃,Surface 将我带回开始屏幕。

我无法使用 Visual Studio 和模拟器对此进行模拟。使用调试位置暂停/恢复不会重新创建它。

我查看了 Surface 上的事件日志,发现我的应用程序崩溃并出现以下情况:

The process was terminated due to an unhandled exception. 

Exception Info: System.Exception Stack: at
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at
System.Threading.WinRTSynchronizationContext+Invoker.<InvokeCore>b__0(System.Object) at
System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object) at
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at
System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() at System.Threading.ThreadPoolWorkQueue.Dispatch() at
System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

我不知道如何找到这个。我正在使用标准消息框处理所有未处理的异常,但它没有显示出来。我们一直非常擅长避免“异步无效”并确保所有内容都具有“异步任务”并正确等待。所以,我有点卡住了。我找不到发生这种情况的地方。

任何人都知道我可以如何模拟这一点,或者至少让事件日志更详细?

【问题讨论】:

  • 我没有答案,但我会在您的加载/保存和导航方法中添加一些日志记录。我假设您使用 LayoutAwarePage 作为基础 - 如果是这样,您可以覆盖 LoadStateSaveStateOnNavigatedToOnNavigatedFrom。这些日志至少可以让您了解崩溃前您的应用发生了什么。
  • 谢谢@chuex。我尝试了页面事件/状态中的所有内容,但没有运气。这是框架深处的东西。我敢肯定,一旦我弄清楚了这一点,我就会学到一些有价值的东西:)
  • 您是否偶然在应用程序中使用了任何计时器,例如DispatcherTimer?当我的应用程序不在屏幕上时,计时器会暂停,然后在我切换回我的应用程序时立即触发。只是要检查的其他内容。

标签: windows-8 visual-studio-2012 windows-runtime


【解决方案1】:

在我看来,您拥有测试场景所需的一切。但是您可能不知道您可以在 Surface 上远程调试您的应用程序,就像它在本地运行一样。因此,您可以继续执行您的用例并让 Visual Studio 捕获异常:

这很容易。这是一个演练:http://timheuer.com/blog/archive/2012/10/26/remote-debugging-windows-store-apps-on-surface-arm-devices.aspx

【讨论】:

  • 感谢@Jerry,但不幸的是远程调试不能模拟这一点。当 Surface 变暗并关闭屏幕时,一段时间后,Visual Studio 会告诉我它已失去与远程设备的连接并停止调试。我正在诉诸蛮力调试,在那里我删除所有内容并慢慢重新引入这些部分,直到找到罪魁祸首。
  • 我明白了。抱歉,正在发生这种情况。日志中没有任何内容?那么,您将需要在脑海中逐步完成。简历发生时触发什么。我无法真正帮助您提供具体信息,但您可以写出一个文件(如本地文件夹)并进行一些调试。几乎可以肯定它在您的 Resuming 或 Activated 或 Loaded 或类似的方法中。再说一次,也许它与序列化有关。也许更多try {} catch {} 可能会帮助您识别它。如果您愿意,可以尝试将整个页面包装起来(当然是为了测试)。
【解决方案2】:

好的,我想通了。

MediaElement 控制和音量存在问题。当应用程序按照我上面的解释重新激活时,我们会收到音量已更改的通知。但是由于某种原因,如果我们在应用重新激活时尝试操纵MediaElement.Volume,它会引发异常。这个异常没有消息,只是一些奇怪的十六进制数字。

这只会发生在平板电脑上,而且很难检测到。本质上,对于所有播放媒体文件的人,您应该像这样尝试/捕捉它:

try
{
   myMediaElement.Volume = .3;
}
catch (Exception ex)
{
   // I don't really know what to do here.
   // but at least my app doesn't crash anymore :)
}

无论如何,感谢@JerryNixon 和@chuex 的帮助。

【讨论】:

  • 什么是奇怪的十六进制数?我的猜测是它是一个 HRESULT,它会为可能发生的事情提供进一步的线索。
  • @RaymondChen,“HRESULT 异常:0xC00D4E86”
  • 快速Web search for the error code 0xC00D4E87 显示错误代码表示“音频播放设备不再存在”。可能发生的情况是音频设备由于断电而脱机,因此当您的应用恢复时,它需要重新获取它。