2011-03-08 6 views
6

Cuando escribo el código siguiente, ¿por qué obtengo un número de hilo como 1022, 1020. ? Tengo que obtener 25 hilos como máximo, ya que estoy utilizando el grupo de hilos.Número de hilo activo en el grupo de hilos

Supongo que el número de subproceso de salida es el de los hilos disponibles en el sistema. Necesito obtener el número de subproceso disponible en mi grupo de subprocesos, en la aplicación de formulario de ganar.

private void Foo() 
{ 
    int intAvailableThreads, intAvailableIoAsynThreds; 

    // ask the number of avaialbe threads on the pool, 
    //we really only care about the first parameter. 
    ThreadPool.GetAvailableThreads(out intAvailableThreads, 
     out intAvailableIoAsynThreds); 

    // build a message to log 
    string strMessage = 
     String.Format(@"Is Thread Pool: {1}, 
      Thread Id: {2} Free Threads {3}", 
      Thread.CurrentThread.IsThreadPoolThread.ToString(), 
      Thread.CurrentThread.GetHashCode(), 
      intAvailableThreads); 

    // check if the thread is on the thread pool. 
    Trace.WriteLine(strMessage); 

    // create a delay... 
    Thread.Sleep(30000); 

    return; 
} 

Muchas gracias ..

(Nota: Tengo el código de http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx) Interesante artículo !!

+1

¡Sin duda ese artículo es excelente, pero está escrito en 2006! – Azmeer

Respuesta

8

Tengo que obtener 25 hilos máx. Ya que estoy usando el grupo de subprocesos.

El número de subprocesos en el grupo de subprocesos por núcleo ha cambiado mucho con el tiempo. Ya no son 25 por núcleo, lo que sospecho es lo que esperabas.

Por ejemplo, la ejecución de este en mi portátil hyperthreaded de cuatro núcleos con .NET 4, consigo 32767 subprocesos de trabajo y 1000 IO hilos de puerto de finalización:

using System; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     int worker; 
     int ioCompletion; 
     ThreadPool.GetMaxThreads(out worker, out ioCompletion); 
     Console.WriteLine("{0}/{1}", worker, ioCompletion); 
    }  
} 

Bajo .NET 3.5 consigo 2000 subprocesos de trabajo y todavía 1000 subprocesos de puerto de terminación IO.

+0

Configuré Thread.SetMaxThread en 10001, después de eso cada vez que ejecuto su programa, muestra el hilo máximo 10001, es persistente. No reinicié mi sistema core i 5. ¿Es posible que en su sistema algún proceso lo ajuste a los números que le dieron? –

+0

Me pregunto cómo conseguiste 2000 hilos de trabajo en fw 3.5, mientras que supongo que es 250 por núcleo (en fw3.5) - entonces quad = 4 lo que significa 4 * 250 = 1000. (por lo que es bastante extraño que tengas 2000) ..... (mmm tal vez la cosita hyperthreaded?) –

4

Usa ThreadPool.GetMaxThreads para obtener lo que quieres.

This article ayuda a explicar todo lo que necesita saber sobre ThreadPool.

+0

Parece que puedes llevar un caballo al agua, pero a veces se supone que debes copiarlo y pegarlo para ellos también ... – Rory

+1

@Rory, o, parece que esto la respuesta es solo un enlace, y debería ser un comentario en su lugar. – gdoron

-1
int available; 
int maxLimit; 
System.Threading.ThreadPool.GetAvailableThreads(out available, out maxLimit); 
+1

En esta función, los hilos disponibles son disponibles, pero maxLimit son los puertos de terminación disponibles. Debe llamar a GetMaxThreads para averiguar maxLimit. –

1

Configuré ambos en 10001, usando ThreadPool.SetMaxThread. Después de eso cada vez que ejecuto su programa, muestra el máximo de 10001, su persistencia. No reinicié mi sistema core i 5.

Después de eso me puse tanto que a 10 millones, y que está mostrando siguiente hilo recuento máximo

trabajador: 32767 ioCompletion: 32767

Así que en mi Windows 7 Intel Core i5, esto es la capacidad máxima.

Cuestiones relacionadas