5

PeriodicTask バックグラウンド エージェントを介してライブ タイルを更新する Windows Phone 7 アプリをマーケットプレースにデプロイしています。

1 人のユーザーが、しばらく動作していたタイルが更新されないという問題を報告しています。

彼らが電話でバックグラウンド タスクを確認すると、それは無効になっており、[次回このアプリケーションを開いたときにバックグラウンド タスクをオンに戻す] チェックボックスがオンになっています。

アプリを開いてピン操作を再試行した後、バックグラウンド タスクが再開されませんでした。

これは、App Hub で見た 2 つのクラッシュ レポートに関連している可能性があると思われます。

問題関数: 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ため、値は各呼び出しで同じになります。

この例外をキャッチして、バックグラウンド エージェントが存在しない、またはエージェントに問題があることを示していると想定する必要がありますか?

この段階では、エミュレーターでアプリを実行するときに例外を再現できません。


「バックグラウンド エージェントが 2 回連続してクラッシュすると、スケジュールから削除されます」

次のように、すべての呼び出しで 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();
}

これにより、バックグラウンド タスクが 2 回の呼び出し後にエミュレーターの設定でオフになります。ただし、ScheduledActionService.Find へのアプリ呼び出しを再度開くと、例外なく機能します。失敗した PeriodicTask を削除して、問題なく新しいインスタンスを追加することもできます。


「電話の設定でバックグラウンドエージェントが無効になっていると、例外がスローされる可能性があります。その場合、ScheduledActionService.Findではなく、ScheduledActionService.Addで例外がスローされると思います」

エミュレータでこれを試しました。から次の例外が発生しScheduledActionService.Add(task);ます。

System.InvalidOperationException - 「BNS エラー: アクションは無効です\r\n」

ScheduledActionService.Find の呼び出しは引き続き正常に機能します。

4

1 に答える 1

1

エミュレーターとPCに接続された受話器でArgumentExceptionとStackTraceを再現することができました。

手順は次のとおりです。

  1. の呼び出しの周りの例外ハンドラーにブレークポイントを設定しますScheduledActionService.Find(TASK_NAME)
  2. デバッガーを接続した状態で、エミュレーター(またはハンドセット)でアプリを起動します
  3. ピンメニュー項目を使用して、PeriodicTaskバックグラウンドエージェントを開始します。デバッグモードではScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1));、PeriodicTaskを追加した直後に呼び出すことに注意してください。
  4. アプリのサブページに移動します。
  5. すばやく戻るボタンを使用してメインページに戻り、もう一度アプリケーションを終了します。MainPageのLoadedイベントはSetupApplicationBar()、最終的にScheduledActionService.Find()メソッドを呼び出します。
  6. アプリケーションがシャットダウンしているときに、例外が発生します。

例外タイプ:ArgumentException

メッセージ:E_INVALIDARG

スタックトレース:

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

アプリがシャットダウンしていて、バックグラウンドエージェントが実行されているかどうかだけを把握しようとしていることを考えると、例外をキャッチしてTaskIsActive()メソッドからfalseを返すのが安全だと思います。

ArgumentExceptionからのメッセージがE_INVALIDARGであることがわかったので、Application_ExitイベントでScheduleActionServiceを呼び出すときに同じエラーが発生することを説明する、WindowsPhone7での設定アラームを見つけました。

于 2012-06-09T04:30:28.353 に答える