2010-03-15 7 views
5

Tengo un hilo en mi aplicación que ejecuta código que potencialmente puede causar daños en la pila de llamadas (mi aplicación es una herramienta de prueba para dlls).¿Cómo termino un hilo .NET que tiene su pila de llamadas dañada?

Suponiendo que tengo un método para detectar si el hilo secundario se está comportando mal, ¿cómo lo terminaría? Según lo que leí, llamar a Thread.Abort() sobre el hilo que funciona mal sería equivalente a generar una excepción dentro de él. Temo que no sea una buena idea, siempre que la pila de llamadas del hilo esté dañada. ¿Alguna sugerencia?

+0

Necesita volver a escribir el código porque eso nunca debería suceder. – ChaosPandion

+1

Como dije, estoy tratando de hacer una herramienta de prueba, así que debo asumir que cualquier función dll que esté probando es potencialmente peligrosa. –

+1

Una vez más mi comprensión de lectura me ha fallado. Mis disculpas. – ChaosPandion

Respuesta

6

Si está ejecutando un código no confiable que podría dañar su proceso, ejecute ese código en un proceso separado y comuníquese con él mediante la comunicación entre procesos. Si quiere terminar el código que no es de confianza antes, puede simplemente matar el proceso.

+1

De repente tengo esa canción de Monzy "Kill dash nine" atrapada en mi cabeza. –

+0

http://www.monzy.com/intro/killdashnine_lyrics.html –

3

Si el código se está portando mal, puede hacer cualquier cosa, y puede afectar cualquier cosa en todo el proceso, en cualquier hilo.

La solución más confiable es ejecutar el código que no es de confianza en un proceso separado, y luego finalizar el proceso si se comporta mal.

+0

matar siempre. Ejecutarlo en su propio hilo sería arriesgado y poco confiable, gracias a los posibles finalizadores que no son de confianza que pueden hacer NADA ... – luckyluke

3

carga la DLL en un nuevo dominio de aplicación y ejecutar el código en el archivo DLL de allí usando el método AppDomain.DoCallBack.

0

Además de la respuesta de aceptación, me gustaría añadir que es trivialmente fácil ignorar Thread.Abort.

try 
{ 
    ... 
} 
catch (ThreadAbortException) 
{ 
    Thread.ResetAbort(); 
} 
Cuestiones relacionadas