2010-03-17 9 views
7

¿Cómo has podido averiguar que un Exception se produjo en un Thread en un multiproceso aplicación? y limpiar consecutivamente los recursos?excepciones que cogen en un hilo .NET

Porque de lo contrario, el subproceso puede permanecer en la memoria y ejecutándose.

Respuesta

5

Como Sean ha dicho, lo que tiene que hacer todo el manejo de excepciones y la limpieza en el interior del método de hilo, no se puede hacer en la inicialización del hilo. Por ejemplo:

public void Run() 
{ 
    try 
    { 
     Thread thread1 = new Thread(ThreadEntry1); 
     thread1.Start(); 

     Thread thread2 = new Thread(ThreadEntry2); 
     thread2.Start(); 
    } 
    catch (NotImplementedException) 
    { 
     // Neither are caught here 
     Console.WriteLine("Caught you"); 
    } 
} 

private void ThreadEntry1() 
{ 
    throw new NotImplementedException("Oops"); 
} 

private void ThreadEntry2() 
{ 
    throw new NotImplementedException("Oops2"); 
} 

En cambio, este enfoque es más autónomo y, obviamente, también funciona:

public void Run() 
{ 
    Thread thread1 = new Thread(ThreadEntry1); 
    thread1.Start(); 
} 

private void ThreadEntry1() 
{ 
    try 
    { 
     throw new NotImplementedException("Oops"); 
    } 
    catch (NotImplementedException) 
    { 
     Console.WriteLine("Ha! Caught you"); 
    } 
} 

Si usted quiere saber si el hilo ha fallado, entonces usted debería considerar una serie de WaitHandles y devuelve la señal a tu método de llamada. Un enfoque alternativo y más sencillo es simplemente incrementar un contador cada vez que la operación de un subproceso termina:

Interlocked.Increment(ref _mycounter); 
1

R. Tiene una pila de llamadas, y se puede tomar en el interior del hilo y añadir el ID del tema en el registro supongo ...

Si envuelve el hilo de una buena manera, puede agregar limpiar el código de la sección catch, terminando el thread si es necesario.

+0

De acuerdo. No veo eso como un problema: comienzas un hilo, entra en un método tuyo ... entonces, ¿qué es lo que te impide manejar excepciones allí? – TomTom

2

Si le preocupa este tipo de cosas, entonces debe envolver su punto de entrada de hilos en un bloque try/catch y hacer la limpieza explícitamente. Cualquier excepción que pase por el punto de entrada del hilo hará que la aplicación se cierre.

+0

No puede detectar ThreadAbortException en .Net 3.5 o inferior con la configuración predeterminada y no puede detectar excepciones que puedan representar un estado dañado en .Net 4.0, también con configuraciones predeterminadas. Así que no puede capturar todas las excepciones con un bloque try catch usando la configuración predeterminada (no se recomienda que lo haga) –

+3

No arroja una ThreadAbortException a menos que anule el hilo; también puede atraparlos, pero no tragarlos a medida que se vuelven a criar automáticamente –

+0

@Chris S, tienes razón +1, he utilizado la captura con el significado de tragar, que no es políticamente correcto. –

1

Puede detectar excepciones dentro de subprocesos como lo haría con cualquier función normal. Si su función de "trabajo" de un hilo se llama DoWork luego hacer algo como esto:

private void DoWork(...args...) 
{ 
try 
{ 
// Do my thread work here 
} 
catch (Exception ex) 
{ 
} 
} 
1

Eric Lippert tiene una reciente post en la maldad de excepciones que ocurren en los subprocesos de trabajo. Vale la pena leer y comprender que una excepción es "excepcional" y de lo único que puede estar seguro después de una excepción en un hilo de trabajo es que ya no puede estar seguro del estado de su aplicación.

Cuestiones relacionadas