ScheduledActionService

ScheduledActionService

我在市场上部署了Windows Phone 7应用程序,该应用程序通过PeriodicTask后台代理更新了其Live Tile。
一位用户报告了磁贴已经工作了一段时间后,磁贴不再更新的问题。
当他们检查电话上的后台任务时,它被禁用,并且选中了“下次打开该应用程序时再次打开后台任务”复选框。
打开应用程序并再次尝试固定操作后,后台任务尚未恢复。
我怀疑这可能与我在App Hub中看到的两个崩溃报告有关:

调用Microsoft.Phone.Scheduler.ScheduledActionService.Find会导致ArgumentException。
我调用Find方法的名称参数来自private const string,因此每次调用的值都相同。
我是否应该仅捕获此异常并假定不存在后台代理,或者它指示代理有问题?
在此阶段,我无法在模拟器中运行应用程序时重现异常。


我尝试在每次调用时故意使ScheduledAgent崩溃,如下所示:

protected override void OnInvoke(ScheduledTask task)
{
    UpdateTile();

#if DEBUG
    // If we're debugging, fire the task again
    ScheduledActionService.LaunchForTest("MyScheduledTaskAgent", new TimeSpan(0, 0, 30));
    throw new Exception("Bang");
#endif

     NotifyComplete();
}
这确实会导致两次调用后在仿真器中的设置下关闭后台任务。但是,如果我重新打开应用程序,对ScheduledActionService.Find的调用将毫无异常(exception)地进行。我还可以删除失败的PeriodicTask并添加一个没有问题的新实例。


我在模拟器中尝试过。我从ScheduledActionService.Add(task);得到以下异常:
System.InvalidOperationException-“BNS错误:该操作已禁用\r\n”
调用ScheduledActionService.Find仍然可以正常工作。

最佳答案

我设法在模拟器和连接到PC的手机上重现ArgumentException和StackTrace。
这些步骤是:

  • 在对ScheduledActionService.Find(TASK_NAME)
  • 的调用周围的异常处理程序中设置断点
  • 附加调试器,在模拟器(或手机)中启动应用程序
  • 使用pin菜单项启动PeriodicTask后台代理。请注意,在 Debug模式下,我在添加PeriodicTask之后立即调用ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1));
  • 导航到我的应用程序中的子页面。
  • 快速使用后退按钮返回主页,然后再次退出应用程序。 MainPage上的Loaded事件调用SetupApplicationBar(),最终调用了ScheduledActionService.Find()方法。
  • 当应用程序关闭时,将发生异常。


  • 鉴于该应用程序已关闭,并且我仅尝试确定后台代理是否正在运行,我认为可以安全地捕获异常并从TaskIsActive()方法返回false。
    现在,我知道来自ArgumentException的消息是E_INVALIDARG,我找到了Setting alarm in Windows Phone 7,它描述了在Application_Exit事件中调用ScheduleActionService时遇到相同的错误。

    10-07 14:57