visual - threadstart c#
Mejor ejemplo de cola de subprocesos/mejores prácticas (5)
Tengo datos que deben ejecutarse en un determinado hilo de fondo. Tengo un código proveniente de todos los otros hilos que necesitan invocar esto. ¿Alguien tiene un buen tutorial o mejor práctica al tener una cola para la sincronización para soportar este requisito de subprocesamiento?
Eche un vistazo a Threading in C # , de Joseph Albahari, una referencia muy completa sobre el multihilo. En particular, él cubre colas productor / consumidor .
Este es un interesante artículo sobre ThreadPools:
Para casos de uso más simples, también podría usar la propia clase ThreadPool de .Net.
Usted podría:
- implementar un modelo de productor / consumidor (que no use fila genérica no segura para subprocesos)
- o use en su hilo de fondo una cola sincronizada , que hace comentarios sobre el proceso de enumeración a través de una colección.
Puedes probar esta solución. Le muestra cómo implementar el patrón productor-consumidor. También tiene alguna explicación sobre qué se puede hacer con ella. Como diferentes combinaciones de la cantidad de productores y consumidores.
Una de mis soluciones favoritas para este problema es similar al patrón producer/consumer
.
Creo un hilo maestro (más o menos el Main()
mi programa que contiene un objeto de cola de bloqueo).
Este hilo maestro genera varios hilos de trabajo que hacen que las cosas se salgan de la hebra de bloqueo central y las procesen. Debido a que es una cola de bloqueo de hilos seguros, los bits de sincronización son fáciles: la llamada a TaskQueue.Dequeue()
se bloqueará hasta que el productor / hilo principal ponga en cola una tarea.
Puede administrar dinámicamente el número de trabajadores que desea o arreglarlo de acuerdo con una variable de configuración, ya que todos están sacando cosas de la cola, el número de trabajadores no agrega ninguna complejidad.
En mi caso, tengo un servicio que procesa varios tipos diferentes de tasks
. Tengo la cola escrita para manejar algo genérico como TaskQueueTask
. Luego subclaselo y anulo el método Execute()
.
También probé el enfoque .NET de la agrupación de subprocesos, donde puedes incluir cosas en el grupo de manera muy sencilla. Era extremadamente simple de usar pero también proporcionaba poco control, y no garantizaba el orden de ejecución, el tiempo, etc. Se recomienda solo para tareas livianas.