2010-12-07 30 views
5

Tengo una función que procesa una lista de 6100 elementos de la lista. El código solía funcionar cuando la lista solo tenía 300 elementos. Pero al instante se bloquea con 6100. ¿Hay alguna manera de recorrer estos 6100 elementos, por ejemplo 30 de cada vez y ejecutar un nuevo hilo por artículo?C# .net para() Paso?

for (var i = 0; i < ListProxies.Items.Count; i++) 
    { 
     var s = ListProxies.Items[i] as string; 
     var thread = new ParameterizedThreadStart(ProxyTest.IsAlive); 
     var doIt = new Thread(thread) { Name = "CheckProxy# " + i }; 
     doIt.Start(s); 
    } 

Cualquier ayuda sería muy apreciada.

+3

Para el registro, detectando y nombrando exactamente lo que falla (la línea) y el mensaje de error ayuda enormemente en la búsqueda de soluciones – Eric

Respuesta

10

¿Usted realmente necesita generar un nuevo hilo para cada elemento de trabajo? A menos que exista una necesidad real de esto (de ser así, cuéntenos por qué), le recomendaría usar el Managed Thread Pool. Esto le dará los beneficios de concurrencia que necesita, pero sin los requisitos de recursos (así como la creación, destrucción y masivos costos de cambio de contexto) de ejecutar miles de subprocesos. Si está en .NET 4.0, también puede considerar usar el Task Parallel Library.

Por ejemplo:

for (var i = 0; i < ListProxies.Items.Count; i++) 
{ 
    var s = ListProxies.Items[i] as string; 
    ThreadPool.QueueUserWorkItem(ProxyTest.IsAlive, s);  
} 

En otra nota, en serio consideraría la posibilidad de cambiar el nombre del IsAlive método (que se parece a una propiedad booleana o método) desde:

  1. está claro que tiene una firma void IsAlive(object) .
  2. Tiene efectos secundarios observables (según su comentario que "incrementa una barra de progreso y agrega un proxy 'activo' a una nueva lista").
+1

El ThreadPool sería absolutamente el camino a seguir aquí. Los hilos son caros. – lesscode

+0

De acuerdo. A menos que estos sean hilos de larga ejecución, este sería un lugar para el grupo de hilos. Supongo que también podría consultar la biblioteca paralela y usar parallel.for para distribuir la carga entre los núcleos. – Zippit

+0

@Wayne Los hilos no son realmente caros ... 6000 hilos es simplemente excesivo :-) (Tiene razón al usar algo para administrar el número). –

3

Existe un límite en la cantidad de hilos que puede engendrar. 6100 hilos parece un poco excesivo.

Estoy de acuerdo Ganar Ani, debe buscar en un ThreadPool o incluso en un proceso de Productor/Consumidor, dependiendo de lo que esté tratando de lograr.

Existen varios procesos para manejar aplicaciones de subprocesos múltiples, pero sin saber lo que se está haciendo al principio no hay forma de recomendar otro enfoque que no sea un proceso ThreadPool o Producer/Consumer (Colas con SyncEvents).

En cualquier caso, debe tratar de mantener el número de hilos al mínimo, de lo contrario corre el riesgo de bloqueos de hilo, girar cerraduras, esperar bloqueos, bloqueos, condiciones de carrera, quién sabe qué, etc.

Si desea obtener buena información sobre cómo enhebrar con C# consulte el libro Concurrent Programming on Windows By Joe Duffy, es realmente útil.