ScheduledActionService.Find抛出ArgumentException

时间:2012-05-09 05:09:52

标签: windows-phone-7

我在市场上部署了一个Windows Phone 7应用程序,通过PeriodicTask后台代理更新其Live Tile。

一位用户报告该问题在工作一段时间后不再更新。

当他们检查手机上的后台任务时,它会被禁用,并且会选中“下次打开时为此应用程序重新启用后台任务”复选框。

打开应用程序并再次尝试引脚操作后,后台任务尚未恢复。

我怀疑这可能与我在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.InvokeEventHandler 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方法的name参数来自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工作没有异常。我也可以删除失败的PeriodicTask并添加一个没有问题的新实例。


  

“在手机设置中取消激活后台代理时,可能会抛出异常。我认为在这种情况下会在ScheduledActionService.Add上抛出异常,而不是ScheduledActionService.Find”

我在模拟器中试过这个。我从ScheduledActionService.Add(task);获得了以下异常:

System.InvalidOperationException - “BNS错误:操作已禁用\ r \ n”

调用ScheduledActionService.Find仍然可以正常工作。

1 个答案:

答案 0 :(得分:1)

我设法在模拟器和连接到我PC的手机上重现ArgumentException和StackTrace。

步骤是:

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

    异常类型:ArgumentException

         

    消息:E_INVALIDARG

         

    堆栈跟踪:

         

    at Microsoft.Phone.Scheduler.SystemNotificationInterop.CheckHr(Int32 hr)
        在Microsoft.Phone.Scheduler.SystemNotificationInterop.GetNotificationByID(Guid notificationID)
        在Microsoft.Phone.Scheduler.ScheduledActionService.Find(String name)
        在SolarCalculator.Agents.TaskIsActive()
        在SolarCalculator.MainPage.SetupApplicationBar()
        在SolarCalculator.MainPage.MainPage_Loaded(对象发送者,RoutedEventArgs e)
        在MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex,Delegate handlerDelegate,Object sender,Object args)
        在MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj,IntPtr unmanagedObjArgs,Int32 argsTypeIndex,Int32 actualArgsTypeIndex,String eventName)

    鉴于应用程序正在关闭,我只想弄清楚后台代理是否正在运行,我认为捕获异常并从TaskIsActive()方法返回false是安全的。

    现在我知道来自ArgumentException的消息是E_INVALIDARG,我发现Setting alarm in Windows Phone 7描述了在Application_Exit事件中调用ScheduleActionService时出现相同的错误。