2012-05-09 17 views
5

Tengo una aplicación de Windows Phone 7 desplegada en el mercado que actualiza su Live Tile a través de un Agente de fondo PeriodicTask.ScheduledActionService.Find lanza ArgumentException

Un usuario informa problemas con el mosaico que ya no se actualiza después de que ha estado funcionando durante algún tiempo.

Cuando verifican las tareas en segundo plano en el teléfono, se desactivan y la casilla de verificación "Volver a activar las tareas en segundo plano para esta aplicación la próxima vez que la abro" está marcada.

Después de abrir la aplicación y probar la operación de pin otra vez, la tarea en segundo plano no se ha reanudado.

Sospecho que esto puede estar relacionado con dos informes de fallos que he visto en la 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

llamadas a Microsoft.Phone.Scheduler.ScheduledActionService.Find están dando lugar a una excepción ArgumentException.

El parámetro de nombre que estoy llamando al método Buscar proviene de un private const string por lo que el valor será el mismo con cada llamada.

¿Debo detectar esta excepción y asumir que el agente de fondo no está presente o indica que algo anda mal con el agente?

En esta etapa no puedo reproducir la excepción cuando ejecuto la aplicación en el emulador.


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

He intentado estrellarse deliberadamente el ScheduledAgent en cada llamada de la siguiente manera:

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

Esto causa la tarea de fondo para desactivar en la configuración en el emulador después de dos invocaciones. Sin embargo, si vuelvo a abrir las llamadas de la aplicación al servicio ScheduledActionService.Find sin una excepción. También puedo eliminar la PeriodicTask fallida y agregar una nueva instancia sin problema.


"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"

yo probamos este en el emulador. Me da la siguiente excepción de ScheduledActionService.Add(task);:

System.InvalidOperationException - "Error BNS: La acción está desactivado \ r \ n"

llamadas a ScheduledActionService.Find todavía funciona bien.

+0

"En este momento no puedo reproducir la excepción al ejecutar la aplicación en el emulador". Sé que se puede lanzar una excepción cuando el agente de fondo está desactivado en la configuración del teléfono. Creo que en ese caso la excepción se lanza sobre 'ScheduledActionService.Add', no' ScheduledActionService.Find', pero deberías intentarlo. –

+0

Cuando 'Background Agent' se bloquea dos veces en secuencia, se elimina de la programación. Tal vez algunas excepciones son throwns aquí que causan este comportamiento ... – Ku6opr

+0

@ Ku6opr, gracias por la sugerencia. Lo intenté y actualicé la pregunta con los resultados. No parece ser la causa. –

Respuesta

1

Logré reproducir ArgumentException y StackTrace en el emulador y en un teléfono conectado a mi PC.

Los pasos fueron:

  1. establecer un punto de interrupción en un controlador de excepciones en torno a la llamada a ScheduledActionService.Find(TASK_NAME)
  2. iniciar la aplicación en el emulador (o auricular) con el depurador asociado
  3. uso del pin menu item para iniciar el agente de fondo PeriodicTask. Tenga en cuenta que en el modo de depuración llamo al ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1)); inmediatamente después de agregar PeriodicTask.
  4. Navegue a una página secundaria en mi aplicación.
  5. Utilice rápidamente el botón Atrás para volver a la página principal y luego nuevamente para salir de la aplicación. El evento Loaded en MainPage llama al SetupApplicationBar(), que finalmente llama al método ScheduledActionService.Find().
  6. Como la aplicación se está apagando, se producirá la excepción.

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)

Teniendo en cuenta que la aplicación se está cerrando y sólo estoy tratando de averiguar si el agente se está ejecutando fondo Calculo que es seguro para detectar la excepción y volver falsa de mi método TaskIsActive().

Ahora que sé que el mensaje de ArgumentException es E_INVALIDARG Encontré Setting alarm in Windows Phone 7 que describe el obtener el mismo error al hacer llamadas a ScheduleActionService en el evento Application_Exit.

+0

He visto una pila de bloqueo similar: http://forums.create.msdn.com/forums/p/106202/625836.aspx#625836 –

Cuestiones relacionadas