2012-01-03 15 views
11

Tengo una aplicación con los botones de inicio y parada, y un hilo que se ejecuta en segundo plano después de presionar Start. Yo uso MVC y TPL para eso.Manipulación de excepción con TPL sin Wait()

¿Cómo puedo manejar la excepción en el TPL, ya que nunca invoco el método Wait()? En cualquier excepción, necesito mostrar el cuadro de mensaje de error, y este cuadro se debe mostrar después de que se lanzó de inmediato.

Tengo siempre un solo hilo en el fondo, por lo que no puede presionar Inicio sin detener previamente el hilo.

Estoy buscando algunos buenos patrones o mejores prácticas. Tengo una idea para colocar try..catch dentro del hilo, e invocar un evento en cada captura, pero no estoy seguro de que ese enfoque sea buena decisión de arquitectura

Respuesta

24

Si está utilizando Tasks, puede agregar una continuación que sólo se ejecuta si una excepción es lanzada También puede indicarle que se ejecute en su subproceso de interfaz de usuario para que pueda usar sus controles de la interfaz de usuario:

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 
+0

¡Esa es una función muy buena! Gracias – Archeg

+0

@Archeg De nada. –

3

En un alto nivel, el método Wait simplemente toma el Exception que ocurrido en el hilo de fondo, lo envuelve en otro tipo de Exception y lo vuelve a generar. Para que pueda observar el Exception original en el hilo de fondo con un bloque try/catch estándar que rodea su código lógico.

2

No hay nada de malo en manejar la excepción directamente en la tarea (en el hilo de fondo). Si usted necesita para mostrar la interfaz de usuario en el caso de una excepción, puede utilizar el despachador (asumiendo que usted está utilizando WPF o Silverlight): http://msdn.microsoft.com/en-us/magazine/cc163328.aspx