¿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

#6 Pedro
10/10/2008 - 17:29 | Informe spam
Se puede programar una aplicacion completa sin necesidad de multi-hilo,
cierto ?


"RFOG" escribió en el mensaje
news:
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
#7 RFOG
10/10/2008 - 18:33 | Informe spam
Claro. En general muchas veces puedes sustituir los hilos por un timer de
WindowsForms y te funcionará sin problemas, y si tampoco necesitas hacer
algo periódicamente ni siquiera eso.

A veces puede ser deseable tener hilos para operaciones pesadas (como el
caso que nos ocupa), así la aplicación responderá inmediatamente (incluso
matando a mano el hilo si es necesario), pero nadie nos obliga a usarlos.
Otras veces, dado el problema a resolver, la mejor forma será mediante
hilos.

De todo modos, siendo puritas, las aplicaciones .NET son multihilo de por
sí, ya que cada vez que lanzamos una estamos creando varios hilos
internamente para tareas en background como el recolector de basura, el
jitter y otras cosas, aunque a efectos de desarrollo es como si se tratara
de una aplicación con un solo hilo. En C++ puedes elegir el modelo de
runtime (multihilo o monohilo) a la hora de compilar, pero en general en
los lenguajes de más alto nivel no podrás hacerlo (o más bien serán,
siempre, multihilo aunque tu no los uses).

On Fri, 10 Oct 2008 17:29:44 +0200, Pedro wrote:

Se puede programar una aplicacion completa sin necesidad de multi-hilo,
cierto ?


"RFOG" escribió en el mensaje
news:
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.









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.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida