¿La mejor forma de matar un hilo?

10/10/2008 - 11:26 por Gonzalo Rodríguez Carrera | Informe spam
Buenos días.

Estoy desarrollando un control personalizado. Este control es una grid
totalmente personalizada (la creo a base de dibujar las líneas, los
datos, etc...) y lo cierto es que me funciona muy bien.

El tema es que le he añadido un modo en el que si la consulta es muy
grande, por ejemplo, 100.000 registros de 55 campos tarda bastante,
como es lógico. Entonces añadí un proceso de carga mediante dos hilos
que se lanzan simultaneamente:
El primero realiza la carga de los n primeros datos y los "plancha" en
pantalla mientras el segundo hilo permanece cargando la totalidad de
los datos y, cuando los tiene, sustituye al primer "buffer" de datos
estando así todos los datos disponibles.

Esto me funciona de maravillas y nunca hay un parón visible al
usuario.

Ahora mi pregunta es: ¿Como puedo matar de forma segura a esos dos
hilos?

El código de las llamadas es este:

hilo1 = new Thread(this.CargaBufferTemporal);
hilo1.IsBackground = true;
hilo2 = new Thread(this.CargaBufferPrincipal);
hilo2.IsBackground = true;

hilo1.Start();
hilo2.Start();

Como siempre mil gracias por adelantado

Gonzalo Rodríguez Carrera

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
10/10/2008 - 12:18 | Informe spam
"Gonzalo Rodríguez Carrera" wrote in message
news:
[...]
Ahora mi pregunta es: ¿Como puedo matar de forma segura a esos dos
hilos?
[...]
hilo1 = new Thread(this.CargaBufferTemporal);
hilo1.IsBackground = true;
[...]
hilo1.Start();



Si quieres parar el hilo antes de que termine el método al que has
llamado ("CargaBufferTemporal"), puedes usar dos llamadas distintas:
hilo1.Interrupt() e hilo1.Abort(). La primera ocasiona en el método llamado
un ThreadInterruptedException, y la segunda un ThreadAbortException, por lo
que en ambos casos es necesario que metas el contenido del método dentro de
un try...catch. Cuando el catch capture una de estas excepciones, basta con
que hagas un return, con lo que el método termina y por lo tanto finaliza la
ejecución del hilo.
Respuesta Responder a este mensaje
#2 Gonzalo Rodríguez Carrera
10/10/2008 - 12:25 | Informe spam
Gracias Alberto por tu respuesta. La duda me surgía porque tanto con
uno como con otro me saltaba una excepción y pensaba que estaba
haciendo algo mal.

Otra pregunta sobre el tema.

Cuando se finaliza el metodo this.CargaBufferTemporal ejecutado sobre
el hilo1, ¿éste hilo se finalizaría solo? o debo hacer lo que me
acabas de indicar.
Muchas gracias de nuevo
Gonzalo Rodríguez Carrera
Respuesta Responder a este mensaje
#3 Alberto Poblacion
10/10/2008 - 13:04 | Informe spam
"Gonzalo Rodríguez Carrera" wrote in message
news:
Cuando se finaliza el metodo this.CargaBufferTemporal ejecutado sobre
el hilo1, ¿éste hilo se finalizaría solo? o debo hacer lo que me
acabas de indicar.



Sí, cuando finaliza el método, el hilo termina inmediatamente, por lo que
no tienes que hacer nada en especial para pararlo.
Respuesta Responder a este mensaje
#4 RFOG
10/10/2008 - 13:20 | Informe spam
Hola, Alberto.

Es mala cosa matar los hilos "a lo bruto", y sólo debe hacerse si no hay
otra forma (pese a lo que diga la MSDN, se podrían dejar objetos del
núcleo sin liberar). El acercamiento más sencillo lo explico en la segunda
parte de esta entrada:

http://geeks.ms/blogs/rfog/archive/...hilos.aspx

Aunque está en C++/CLI es muy fácil visualizarlo en C#. De todos modos, si
no hay otra, hay que hacerlo como dices.

On Fri, 10 Oct 2008 12:18:24 +0200, Alberto Poblacion
wrote:

"Gonzalo Rodríguez Carrera" wrote in message
news:
[...]
Ahora mi pregunta es: ¿Como puedo matar de forma segura a esos dos
hilos?
[...]
hilo1 = new Thread(this.CargaBufferTemporal);
hilo1.IsBackground = true;
[...]
hilo1.Start();



Si quieres parar el hilo antes de que termine el método al que has
llamado ("CargaBufferTemporal"), puedes usar dos llamadas distintas:
hilo1.Interrupt() e hilo1.Abort(). La primera ocasiona en el método
llamado un ThreadInterruptedException, y la segunda un
ThreadAbortException, por lo que en ambos casos es necesario que metas
el contenido del método dentro de un try...catch. Cuando el catch
capture una de estas excepciones, basta con que hagas un return, con lo
que el método termina y por lo tanto finaliza la ejecución del hilo.







Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Cosas mías: http://rfog.blogsome.com/
Libros, ciencia ficción y programación
Al enfermo que es de vida, el agua es medicina.
Respuesta Responder a este mensaje
#5 Gonzalo Rodríguez Carrera
10/10/2008 - 13:29 | Informe spam
Muchas gracias a los dos por vuestras respuestas.

Me daba mucha rabia la posibilidad de abandonar la forma que diseñé
para cargar la grid por la posibilidad de que quedase un hilo "zombie"
devorando recursos.
Gracias


Gonzalo Rodriguez Carrera
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida