2010-12-06 18 views
6

¿Alguno de ustedes tiene una idea de cómo atrapar en el hilo principal de una aplicación una excepción lanzada en un hilo en particular?Captura de excepción no controlada de un hilo

Por ejemplo, tengo un hilo muy sencilla de hacer algunas cosas básicas:

try 
     { 
      Thread t = new Thread(new ThreadStart(Cache.initialize)); 
      t.Start(); 
      t.Name = "loading"; 
      while (t.IsAlive) 
      { 
       progressBar1.PerformStep(); 
      } 
     } 

     catch (PropertyOrFieldNotInitializedException ex) 
     { 
      Console.WriteLine(ex.StackTrace); 
      MessageBox.Show("L'application ne peut se connecter au serveur, vérifiez votre connexion"); 
     } 

el problema es que esta captura es inútil, ya que la excepción no se recuperará en la chimenea principal ..

public static void initialize() 
     { 
      try 
      { 
       ctxMdv = new ClientContext(Configuration.getInstance().UrlMdv); 
       ...     
      } 

      catch (PropertyOrFieldNotInitializedException e) //si le serveur n'est pas démarré 
{ 
       throw ; 
      } 

aquí todo se detiene en el "tiro" y no se maneja nada, incluso si en la pila principal intenté atraparlo mostrando un cuadro de mensaje. Entonces, ¿cómo podría detectar esta PropertyOrFieldNotInitializedException en mi hilo? ¿Tendrá algunas mejores prácticas para detectar la excepción de un hilo en C#?

¡Muchas gracias!

PS: Bueno, gracias a la respuesta dada por Thorsten Dittmar abajo, yo podría hacer que funcione de esa manera: aquí es el hilo principal

BackgroundWorker bw = new BackgroundWorker(); 
     bw.WorkerReportsProgress = true; 
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
     bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
     bw.RunWorkerAsync(); 

aquí está mi DoWork:

private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Cache.initialize(); // the thread job 
    } 

aquí está mi evento completado, eso sucede incluso si se produce una excepción:

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (!(e.Error == null)) 

      if (e.Error is WebException) 
       Console.WriteLine(e.Error.StackTrace); 
      MessageBox.Show("L'application ne peut se connecter au serveur, vérifiez votre connexion"); 

     this.Dispose(); 
     Application.Exit(); 
    } 

Y estoy planeando manejar el delegado ProgressChanged para corregir la barra de progresión ...;) ¡gracias!

Respuesta

4

Bueno, una forma sería utilizar BackgroundWorker en lugar de un hilo en su situación. No necesita un bloque try allí, ya que los errores se capturarán automáticamente y se pasarán al manejador que asigne cuando el trabajador finalice.

EDIT:
También puede utilizar un evento de BackgroundWorker reportar el progreso a su forma, por lo que puede actualizar su barra de progreso adecuadamente ;-)

+0

bien! esta funcionando ! muchas gracias ! Editaré mi publicación publicando el código de la solución gracias a usted – KitAndKat

Cuestiones relacionadas