2010-03-29 7 views
6

PREGUNTA: Reutilización de .NET Backgroundworker, ¿no hay una forma de permitir que las excepciones vuelvan normalmente al hilo principal?.NET Backgroundworker: ¿no hay forma de que las excepciones vuelvan normalmente al hilo principal?

ANTECEDENTES:

  • Actualmente en mi aplicación WinForms tengo mango excepción genérica que va a lo largo de las líneas, si (a) una excepción de aplicación personalizada a continuación, presente para el usuario, pero sin salir del programa, y (b) si otra excepción a continuación, presente y entonces la aplicación de salida
  • lo anterior es agradable ya que sólo puede tirar la excepción adecuada en cualquier lugar de la aplicación y la presentación/manejo se maneja de forma genérica

Respuesta

6

El BackgroundWorker reenvía automáticamente la excepción. Está en la propiedad AsyncCompletedEventArgs.Error cuando engancha el evento RunWorkerCompleted.

Si lo desea, puede ajustar y volver a lanzar la excepción en este controlador de eventos, teniendo en cuenta que hay un bug en el marco que provocará la excepción "externa" en su lugar porque está en medio de un Invoke.

Una excepción que se produce en un subproceso de fondo en una aplicación .NET es un error catastrófico que puede y traerá consigo todo el proceso; La única forma de tratar con esto es envolver toda la actividad en un bloque try-catch y guardar cualquier excepción que ocurra, que es exactamente lo que hace el BackgroundWorker.

+0

@Aaronaught - ¿quisiste decir "eso causará que se produzca la excepción" interna "? (gracias por responder) – Greg

+0

¡Lo tengo! Acabo de crear una nueva BusinessException dentro de backgroundWorker1_RunWorkerCompleted y establecí la innerException en "null". – Greg

1

No, no hay iSN' t.

En su lugar, se puede hacer una clase que hereda BackgroundWorker y anula OnRunWorkerCompleted para comprobar e.Error y ejecutar manejador de excepción si no es null.

+0

gracias por la idea – Greg

2

Si el método asincrónico llamado por DoWork arroja una excepción, esa excepción estará disponible para el manejador RunWorkerCompleted. Puedes manejarlo allí.

private void backgroundWorker1_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e) 
{ 
    // First, handle the case where an exception was thrown. 
    if (e.Error != null) 
    { 
     MessageBox.Show(e.Error.Message); 
    } 
    ... 
} 

De MSDN:

Si se produce una excepción durante una operación asíncrona , la clase asignar la excepción a la propiedad error. El delegado del controlador de eventos de la aplicación cliente debe marcar la propiedad Error antes de acceder a las propiedades de una clase derivada de AsyncCompletedEventArgs; de lo contrario, la propiedad generará una TargetInvocationException con su propiedad InnerException que contiene una referencia a Error.

Cuestiones relacionadas