我在市场中部署了一个 Windows Phone 7 应用程序,该应用程序通过 PeriodicTask 后台代理更新其动态磁贴。
一位用户报告磁贴在工作一段时间后不再更新的问题。
当他们检查手机上的后台任务时,它被禁用,并且选中了“下次打开此应用程序时重新打开后台任务”复选框。
打开应用程序并再次尝试 pin 操作后,后台任务尚未恢复。
我怀疑这可能与我在 App Hub 中看到的两个崩溃报告有关:
问题功能:Microsoft.Phone.Scheduler.SystemNotificationInterop.CheckHr
异常类型:ArgumentException
堆栈跟踪:
帧图像函数偏移
量 0 coredll.dll xxx_RaiseException 19
1 mscoree3_7.dll WatsonUnhandledManagedException 296
2 mscoree3_7.dll Dbg_NotifyManagedException 93
3 mscoree3_7.dll FirstPassException 1044
4 TransitionStub 0
5 Microsoft.Phone.Scheduler.SystemNotificationInterop.CheckHr 248
6 Microsoft.Phone.Scheduler.SystemNotificationInterop.GetNotificationByID 156
7 Microsoft.Phone.Scheduler.ScheduledActionService.Find 276
8 MyApp.Agents.TaskIsActive 60
9 MyApp.MainPage.SetupApplicationBar 44
10 MyApp.MainPage.MainPage_Loaded 100
11 MS.Internal.CoreInvokeHandler。调用事件处理程序3660
12 MS.Internal.JoltHelper.FireEvent 1348
13 mscoree3_7.dll IL_CallManaged 884
14 mscoree3_7.dll IL_CallDelegateInternal 176
15 mscoree3_7.dll makeComPlusCall 5255
16 mscoree3_7.dll makeComPlusCallReturnInt 21
17 0
18 agcore.dll CCoreServices::CLR_FireEvent 385
对 Microsoft.Phone.Scheduler.ScheduledActionService.Find 的调用会导致 ArgumentException。
我在调用 Find 方法时使用的名称参数来自 a private const string
,因此每次调用的值都相同。
我应该抓住这个异常并假设后台代理不存在还是表明代理有问题?
在这个阶段,在模拟器中运行应用程序时,我无法重现异常。
“当 [the] Background Agent 依次崩溃两次时,它会从调度中删除”
我尝试在每次调用时故意使 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 的应用程序调用,则无一例外。我还可以删除失败的 PeriodicTask 并添加一个新实例而不会出现问题。
“在手机设置中停用后台代理时,可能会引发异常。我认为在这种情况下,异常会在 ScheduledActionService.Add 上引发,而不是 ScheduledActionService.Find”
我在模拟器中试过这个。我从以下异常中得到ScheduledActionService.Add(task);
:
System.InvalidOperationException - “BNS 错误:操作已禁用\r\n”
调用 ScheduledActionService.Find 仍然可以正常工作。