2009-02-10 6 views
6

colegas concurrentes.Excepción de trampa desde el hilo de fondo

Necesito poder atrapar una excepción que pueda arrojarse desde un hilo de fondo.

Vamos el código hable por sí misma (que es un mal código)

public delegate bool CheckForUpdatesHandler(Uri uri); 
    public class UpdatesChecker { 
     public event AsyncCompletedEventHandler CheckForUpdatesAsyncCompleted; 
     protected virtual void OnCheckForUpdatesAsyncCompleted(AsyncCompletedEventArgs args) { 
      if (CheckForUpdatesAsyncCompleted != null) 
       CheckForUpdatesAsyncCompleted(this, args); 
     } 

     public bool CheckForUpdates(Uri ftp) {    
      Thread.Sleep(1000); 
      throw new Exception("bla"); 
      return true; 
     }  


     public void CheckForUpdatesAsync(Uri ftp){    
      var action = new CheckForUpdatesHandler(CheckForUpdates); 
      var c=action.BeginInvoke(ftp, delegate(IAsyncResult state) { 
       OnCheckForUpdatesAsyncCompleted(new AsyncCompletedEventArgs(null, false, null)); 
      }, null); 
     }  
    } 

Respuesta

8

Con Delegate.BeginInvoke, la excepción será recuperar llamando .EndInvoke - que se debe hacer de todos modos para evitar una fuga.

Con BackgroundWorker, que aparecerá en el evento de finalización

En un Thread de vainilla, una excepción no controlada se rasgará el proceso.

Sin embargo, el enfoque más simple es: no deje que tirar ...

public bool CheckForUpdates(Uri ftp) { 
     try { 
      Thread.Sleep(1000); 
      throw new Exception("bla"); 
      return true; 
     } catch (Exception ex) { 
      // raise an event, call a method/callback, do something 
     } 
    } 

Si actualmente no está utilizando EndInvoke, entonces tal vez cambiar al patrón de arriba y sólo tiene que utilizar ThreadPool directamente (en lugar que Delegate.BeginInvoke).

+0

Gracias, Marc, me has ayudado de nuevo :-) – Valentin

Cuestiones relacionadas