我在市场上部署了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)
ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1));
。 SetupApplicationBar()
,最终调用了ScheduledActionService.Find()
方法。 鉴于该应用程序已关闭,并且我仅尝试确定后台代理是否正在运行,我认为可以安全地捕获异常并从
TaskIsActive()
方法返回false。现在,我知道来自ArgumentException的消息是E_INVALIDARG,我找到了Setting alarm in Windows Phone 7,它描述了在Application_Exit事件中调用ScheduleActionService时遇到相同的错误。