2010-12-10 22 views
6

estoy usando el ThreadPool que hacer cola 1000 de los elementos de trabajo¿Cómo puedo determinar el número de elementos en ThreadPool cola

While(reading in data for processing) 
{ 
    args = some data that has been read; 
    ThreadPool.QueueUserWorkItem(new WaitCallback(threadRunner), args); 
} 

Esto está funcionando muy bien, sin embargo, como el hilo conductor pone en cola las peticiones más rápido de lo que son la memoria procesada se consume lentamente.

me gustaría hacer algo parecido a lo siguiente para estrangular la puesta en cola como la cola crece

Thread.Sleep(numberOfItemsCurrentlyQueued); 

Esto daría lugar a esperas más largas que la cola crece.

¿Hay alguna manera de descubrir cuántos elementos hay en la cola?

Respuesta

2

No creo que haya una forma incorporada, pero puede introducir un contador [estático?] Que aumentaría/disminuiría; para eso tendrías que crear tu propio método que envolvería a ThreadPool.QueueUserWorkItem() y se ocuparía del contador.

Por cierto, en caso de que esté ejecutando .NET 4.0, debe usar TaskFactory.StartNew en lugar de ThreadPool.QueueUserWorkItem(): se dice que tiene una mejor administración de memoria/subprocesos.

4

Una abstracción más manejable para la cola Producer/Consumer es BlockingCollection<T>. El código de ejemplo allí muestra cómo usar Tareas para inicializar y drenar la cola. El recuento de colas está disponible en la propiedad Count.

Si puede, evite usar Sleep para retrasar la producción de más artículos. Haga que el productor espere en un Evento o similar cuando la cola sea demasiado grande, y haga que los consumidores señalicen el Evento cuando la acumulación de cola llegue a un umbral en el que se sienta cómodo permitiendo que se produzcan más artículos. Siempre trate de hacer que las cosas sean impulsadas por eventos: Sleep es una especie de suposición.

+0

He aceptado la respuesta dada por Andrey cuando respondió el título de la pregunta "¿Cómo puedo determinar el número de elementos en ThreadPool Queue?" sin embargo, su respuesta es la más útil para mí, gracias por compartir esta solución. – Perrin255

+0

Me alegro de que esto sea útil. Buena suerte. –

Cuestiones relacionadas