2012-03-07 13 views
8

Tengo un método void DoWork(object input) que tarda aproximadamente 5 segundos en completarse. He leído que Thread es más apropiado que ThreadPool para estas operaciones más largas, pero he encontrado un problema.Tema: ¿Cómo reiniciar el hilo una vez completado?

Hago clic en un botón que llama al threadRun.Start(input) que se ejecuta y completa bien. Hacer clic en el botón de nuevo y recibir la siguiente excepción:

Thread is running or terminated; it cannot restart.

Puede que no "reutilización" de un hilo? ¿Debo usar ThreadPool? ¿Por qué el hilo es "más adecuado para operaciones más largas" en comparación con ThreadPool? Si no puede reutilizar un hilo, ¿para qué usarlo (es decir, qué ventajas ofrece)?

+0

Acabo de revisar un código mío y recreo el hilo cada vez Necesito reutilizarlo. Hice esto ya que estaba obteniendo exactamente el mismo error en mi código también. En mi caso, no fue demasiado costoso hacer esto, así que no investigué más. Para – ChrisF

+0

hilo vs ThreadPool mira esto [post StackOverflow] [1] [1]: http://stackoverflow.com/questions/230003/thread-vs-threadpool –

Respuesta

10

¿No puedes "reutilizar" un hilo?

Puedes. Pero debe codificar el hilo para que no finalice, sino que espere más trabajo. Eso es lo que hace un grupo de subprocesos.

¿Debo usar ThreadPool?

Si desea volver a utilizar un hilo, sí.

¿Por qué el hilo es "más adecuado para operaciones más largas" en comparación con ThreadPool?

Imagine un grupo de subprocesos que está sirviendo una gran cantidad de operaciones rápidas. No desea tener demasiados hilos, porque la computadora solo puede hacer muchas cosas a la vez. Cada operación larga que realice el grupo de subprocesos enlaza un subproceso del grupo. Por lo tanto, el grupo debe tener muchos hilos adicionales o puede faltar menos hilos. Ninguno de los dos conduce a un diseño de grupo de hilos eficiente.

Para operaciones más largas, la sobrecarga de crear y destruir un hilo es muy pequeña en comparación con el costo de la operación. Entonces, la desventaja normal de usar un hilo solo para la operación no se aplica.

Si no puede reutilizar un hilo, ¿para qué usarlo (es decir, qué ventajas ofrece)?

Supongo que quiere decir utilizar un hilo dedicado a un trabajo que luego finaliza con el uso de un grupo de subprocesos. La ventaja es que el número de subprocesos siempre será igual al número de trabajos de esta manera. Esto significa que tienes que crear un hilo cada vez que comienzas un trabajo y destruir un hilo cada vez que terminas uno, pero nunca tienes hilos adicionales ni te faltan hilos. (Esto puede ser algo bueno con los hilos vinculados de E/S, pero puede ser algo malo si la mayoría de los hilos están vinculados a la CPU la mayor parte del tiempo.)

+0

gran respuesta! Gracias por tomarse el tiempo para responder a mis numerosas preguntas. :) – john

1

Como dice el mensaje, no puede reiniciar el hilo. Simplemente puede crear un nuevo hilo para su próxima operación. O bien, podría considerar un diseño donde el hilo de fondo continúe funcionando hasta que complete todas sus tareas, en lugar de lanzar un nuevo hilo para cada una.

1

Parece que por diseño.

Me encontré con el mismo problema y la única solución que pude encontrar fue volver a crear el hilo. En mi caso, no estaba reiniciando el hilo con mucha frecuencia, así que no busqué más.

Una búsqueda ahora ha aparecido this thread on social.msdn donde los estados respuesta aceptada:

un hilo parado o abortado no se puede afirmar de nuevo.

El MSDN repita esto también:

tratando de reiniciar un hilo abortado llamando al inicio de un hilo que ha terminado tiros un ThreadStateException.

0

Está en modo de fondo. Parece que necesita usar ThreadPool porque reiniciar y volver a crear objetos Thread son operaciones muy costosas. Si tiene un trabajo de larga duración que puede durar más que su proceso principal, considere el uso de un servicio de Windows.

1

for(;;){} o while(true){} son construcciones útiles para 'reutilizar' un hilo. Normalmente, el subproceso espera en algún objeto de sincronización en la parte superior de estos bucles. En su ejemplo, puede esperar en un evento o semáforo e indicarlo desde su controlador de botón OnClick().

documentación
3

Thread.Start dice:

Una vez que el subproceso termina, no se puede reiniciar con otra llamada a Inicio.

Los hilos no son reutilizables. Ya me he enfrentado a este problema hace un tiempo, la solución era crear una nueva instancia de Thread siempre que fuera necesario.

Cuestiones relacionadas