2012-05-09 3 views
5

Ho un'app di Windows Phone 7 distribuita nel marketplace che aggiorna la sua Live Tile tramite un agente di background PeriodicTask.ScheduledActionService.Find getta ArgumentException

Un utente sta segnalando problemi con il riquadro che non si sta più aggiornando dopo che ha funzionato per un po 'di tempo.

Quando controllano le attività in background sul telefono è disabilitato e la casella di controllo su "Riapri le attività in background per questa applicazione alla successiva apertura" è selezionata.

Dopo aver aperto l'app e aver provato nuovamente l'operazione pin, l'attività in background non è stata ripristinata.

ho il sospetto che questo può essere correlato a due segnalazioni di crash che ho visto in App Hub:

Problem Function: Microsoft.Phone.Scheduler.SystemNotificationInterop.CheckHr

Exception Type: ArgumentException

Stack Trace:

Frame Image Function Offset
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

chiamate ai Microsoft.Phone.Scheduler.ScheduledActionService.Find si traducono in un ArgumentException.

Il parametro nome con cui sto chiamando il metodo Find proviene da un private const string in modo che il valore sia lo stesso per ogni chiamata.

Devo solo rilevare questa eccezione e presupporre che l'agente in background non sia presente o indichi che qualcosa non va nell'agente?

A questo punto non riesco a riprodurre l'eccezione durante l'esecuzione dell'app nell'emulatore.


"When [the] Background Agent crashes two times in sequence, it's removed from scheduling"

Ho provato deliberatamente schiantarsi lo ScheduledAgent ad ogni chiamata come segue:

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(); 
} 

Questo provoca il compito di sfondo per spegnere nelle impostazioni nell'emulatore dopo due invocazioni. Tuttavia, se riapro l'app, le chiamate a ScheduledActionService.Find funzionano senza un'eccezione. Posso anche rimuovere il PeriodicTask fallito e aggiungere una nuova istanza senza problemi.


"an exception can be thrown when the background agent is deactivated in the phone's settings. I think in that case the exception is thrown on ScheduledActionService.Add, not ScheduledActionService.Find"

Ho provato questo nell'emulatore. Ottengo la seguente eccezione da ScheduledActionService.Add(task);:

System.InvalidOperationException - "Errore BNS: L'azione è disattivata \ r \ n"

chiamate ai ScheduledActionService.Find funzionano ancora bene.

+0

"A questo punto non riesco a riprodurre l'eccezione durante l'esecuzione dell'app nell'emulatore." So che un'eccezione può essere generata quando l'agente in background è disattivato nelle impostazioni del telefono. Penso che in questo caso l'eccezione sia lanciata su "ScheduledActionService.Add', non su" ScheduledActionService.Find', ma dovresti provarlo. –

+0

Quando 'Background Agent' si arresta in modo anomalo due volte in sequenza, viene rimosso dalla pianificazione. Forse alcune eccezioni vengono lanciate qui che causano questo comportamento ... – Ku6opr

+0

@ Ku6opr, grazie per il suggerimento. L'ho provato e ho aggiornato la domanda con i risultati. Non sembra essere la causa. –

risposta

1

Sono riuscito a riprodurre ArgumentException e StackTrace nell'emulatore e su un telefono collegato al mio PC.

I gradini erano:

  1. Impostare un punto di interruzione in un gestore di eccezioni in giro la chiamata a ScheduledActionService.Find(TASK_NAME)
  2. avviare l'applicazione nell'emulatore (o portatile) con il debugger
  3. Utilizzare il voce di menu pin per avviare l'agente di background PeriodicTask. Si noti che in modalità debug si chiama ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1)); subito dopo aver aggiunto PeriodicTask.
  4. Passare a una pagina secondaria nella mia app.
  5. Utilizzare rapidamente il pulsante Indietro per tornare alla pagina principale e quindi nuovamente per uscire dall'applicazione. L'evento Loaded in MainPage chiama SetupApplicationBar(), che in definitiva chiama il metodo ScheduledActionService.Find().
  6. Mentre l'applicazione si sta arrestando, si verificherà l'eccezione.

Exception Type: ArgumentException

Message: E_INVALIDARG

StackTrace:

at 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)

Dato che l'applicazione si sta spegnendo e sto solo cercando di capire se l'agente di fondo è in esecuzione Immagino che sia sicuro per catturare l'eccezione e restituire false dal mio metodo TaskIsActive().

Ora che so che il messaggio di ArgumentException è E_INVALIDARG ho trovato Setting alarm in Windows Phone 7 che descrive lo stesso errore durante l'esecuzione di chiamate a ScheduleActionService nell'evento Application_Exit.

+0

Ho visto un crash stack simile: http://forums.create.msdn.com/forums/p/106202/625836.aspx#625836 –