He creado una matriz de hilos y los he empezado a todos. Cómo saber si todos los hilos han completado el trabajo. No quiero usar thread.wait o thread.join.Detección de la finalización de una matriz de hilos
Respuesta
Bueno, usted puede prueba Thread.IsAlive
- pero eso estará desactualizado tan pronto como lo haya probado, por supuesto. Puede mantener una lista de hilos "actualmente vivos" y eliminarlos de uno en uno cuando se detengan, durmiendo entre ejecuciones de prueba. Para obtener información más detallada, puede usar Thread.ThreadState
.
¿Cuál es la imagen más grande aquí? ¿Qué estás tratando de lograr y por qué no quieres llamar al Thread.Join
(potencialmente con un tiempo de espera)?
Si está usando .NET 4 puede usar el método Task Parallel Library y ContinueWhenAll.
Tendría que modificar sus hilos para que se representaran como Task. Las tareas son más fáciles de trabajar con los hilos. Por lo general, no tiene que preocuparse por las cosas de menor nivel, como lo obliga a hacer ahora, como programar o esperar a que se completen las cosas.
¿Para qué fin? Diagnóstico? Console.WriteLine.
De lo contrario, use una variable global (como en: accesible para todos los hilos), increméntela cuando se inicie uno de sus hilos, disminuya cuando termine. Si es 0, todos los hilos terminaron el trabajo, pero debe tener cuidado de sincronizarlo correctamente, de lo contrario obtendrá falsos positivos. Después de iniciar las discusiones que hace una:
while (runningThreadsCount > 0)
{
// There are still working threads
}
¿Qué hay de MyThread.ThreadState == System.Threading.ThreadState.Stopped?
Debe ser '(MyThread.ThreadState & System.Threading.ThreadState.Stopped) == System.Threading.ThreadState.Stopped' ya que 'ThreadState' tiene FlagsAttrbiute y por lo tanto puede" contener "más valores. – Patrick
Puede usar la clase ThreadPool en lugar de una matriz, y usar el método 'GetAvailableThreads' para verificar si todos los subprocesos están disponibles. Ver:
Hacer que los hilos vuelven a llamar a la clase que los haya iniciado en señalar que se hacen
si desea interceptar el trabajo de forma asincrónica puede utilizar BackgroundWorkers todos los cuales tienen un evento RunWorkerCompleted y un error y propiedades cancelados en los argumentos del evento
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
- 1. acceso a la matriz de múltiples hilos
- 2. Detectar la finalización de Animación
- 3. finalización dismissviewcontrolleranimated no llamar a la finalización de UIImagePickerController
- 4. finalización de la pestaña cygwin
- 5. eclipse jsp - sin colores, finalización de código y detección de errores
- 6. Detección de picos de la señal medida
- 7. Problema de finalización de la pestaña PowerShell
- 8. Finalización de la pestaña Bash agrega espacio extra después de la primera finalización
- 9. Finalización de la pestaña IPython no funciona
- 10. ¿Cómo puedo forzar la finalización de urllib2?
- 11. ¿Emacs tiene finalización de palabras y líneas (como la finalización del modo de inserción de Vim)?
- 12. Tetris-ción de una matriz
- 13. iOS5.1: tareas de sincronización (aguarde la finalización)
- 14. Cómo descartar la sugerencia de finalización
- 15. Finalización de la tarea del iPhone
- 16. Finalización de la edición en jqGrid
- 17. Una confusión acerca de $ {array [*]} versus $ {array [@]} en el contexto de una finalización de Bash
- 18. Javascript Detección de colisiones
- 19. Detección de proxy .NET
- 20. UITouch detección de la velocidad de movimiento
- 21. ejecutores de Java: espere la finalización de la tarea.
- 22. ¿Hilos dentro de hilos en Java?
- 23. Creación/finalización del hilo de enganche
- 24. hilos de nomenclatura y conjuntos de hilos-piscinas de ExecutorService
- 25. HttpWebRequest y puertos de finalización de E/S
- 26. En el enhebrado de Python, ¿cómo puedo rastrear la finalización de un hilo?
- 27. devolución de llamada para manejar la finalización de la tubería
- 28. C Objetivo: Detección de una sacudida
- 29. ¿Predicción/finalización de la barra de estado de Vim?
- 30. Finalización de una actividad desde un receptor de difusión
Gracias a todos por su ayuda. Usé Threadcount y resolvió mi problema. Utilicé do while loop: do { Console.WriteLine ("Número de subprocesos: {0}", ImageCompute.threadCount); } while (! (ImageCompute.threadCount == 0)); pero, esto es como contar el número de hilos. Pero tenemos algo así como funciones de devolución de llamada. Delegue lo que podemos adjuntar a cada hilo y se desencadena una vez que se completa. Gracias de nuevo. – Harsha
Este enfoque es propenso a las condiciones de carrera debido a que el incremento y la disminución de un número entero no es una operación atómica (implica una lectura y una escritura). Dos hilos pueden leer el mismo valor, disminuirlo y volver a escribirlo, lo que hace que runningThreadsCount nunca se convierta en 0. –
@Harsha Si desea hacer cosas como continuar el trabajo cuando los hilos terminan, eche un vistazo a la Biblioteca de tareas paralelas (revise mi responder). –