2012-02-14 22 views
10

Tengo un hilo que contiene la ejecución de un script IronPython. Por alguna razón, es posible que deba detener este hilo en cualquier momento, incluida la ejecución del script. ¿Cómo lograr esto? La primera idea es Thread.Abort(), pero se sabe que es malo ...¿Cuál es una forma segura de detener un hilo en ejecución?

+0

Sí, sacudir la alfombra de debajo de un hilo es malo. Pero si eso es lo que quieres hacer, entonces 'Thread.Abort()' es el camino a seguir. La mejor solución es modificar el diseño de su aplicación. –

+0

¿Su cadena de bucles o solo se ejecuta para la ejecución de un solo script y luego muere? –

+0

Se repite, pero cada iteración contiene la ejecución de scripts, que puede ser bastante larga. – aplavin

Respuesta

4

bien de usted pregunta y los comentarios posteriores que se puede sugerir dos opciones, con algunas "advertencias" adicionales:

  1. Si su hilo bucles ejecutar algo en cada iteración, se puede establecer un indicador booleano volátil tal que salga después de terminar la iteración actual (pseudocódigo porque no estoy familiarizado con Python):

    while shouldExit = false 
        // do stuff 
    

    a continuación, sólo establece el indicador de true cuando tú quiere que el hilo se detenga y se detendrá la próxima vez que verifique la condición.

  2. Si no puede esperar a que finalice la iteración y necesita detenerla inmediatamente, puede ir por Thread.Abort, pero asegúrese de que no hay forma de que pueda dejar abiertos los identificadores de archivos, sockets, bloqueos o cualquier otra cosa esto en un estado inconsistente

+1

La primera solución es obvia, pero no es para mi caso. Tenía miedo de usar 'Thread.Abort()', porque en todas partes las personas escriben algo como "¡NUNCA UTILÍCELO!"))). Pero ahora lo uso en el programa: las manijas pueden permanecer abiertas. – aplavin

+2

Es verdad que la mayoría de las veces es malo, pero específicamente porque la gente tiende a usar hilos para E/S u otras cosas como esta que se dejarán en un estado inconsistente si se elimina el hilo. Si no está usando el hilo para algo como esto, entonces es perfectamente seguro. – Tudor

+0

Y se garantizaba, ese hilo con código como este 'try {// hacer el trabajo - sin try/atrapa aquí } captura (ThreadAbortException) {// ingrese salida }' se detendrá después de llamar ' Abort() 'en él? – aplavin

17

¿Cuál es una forma segura de detener un hilo conductor?

Ponga el hilo en su propio proceso. Cuando quiere que se detenga, mata el proceso.

Esa es la única manera segura de matar a un hilo. Anular un hilo puede desestabilizar gravemente un proceso y perder datos de usuario. No hay forma de evitar el escenario de "perder datos de usuario" si realmente necesita poder eliminar un hilo que podría estar haciendo algo. La única forma de evitar la desestabilización del proceso que exige el aborto es hacer que sean procesos diferentes por completo.

+0

En mi caso, no hay forma de que el código de la secuencia desestabilice todo el proceso. Pero para el conocimiento común: al crear diferentes procesos, ¿quiere decir tener dos proyectos compilados en diferentes ensamblajes y uno de ellos ejecutar otro? ¿O que? – aplavin

+1

@chersanya: Pareces muy seguro de ti mismo. Estás ejecutando un script; ¿Cómo sabes que el autor del guión no ha puesto código allí que desestabilizará el proceso o perderá los datos del usuario cuando se interrumpa? –

+0

@chersanya diferentes procesos no necesariamente necesitan ejecutar ensamblados diferentes. Por ejemplo, 'myprogram.exe' podría iniciar un nuevo proceso ejecutando' myprogram.exe'. – phoog

Cuestiones relacionadas