Ciertamente no deberías crear 800 hilos.
Demos un paso atrás aquí. Usted tiene un dispositivo llamado "servidor" que recibe "solicitudes" de "clientes" y envía "respuestas" a esos clientes. Supongamos que las solicitudes son hojas de papel entregadas por la oficina de correos, y las respuestas son cajas que contienen libros, también entregados por la oficina de correos.
Desea simular 800 clientes para probar el servidor.
Supongamos que un hilo es una persona y un procesador es una silla. Una persona solo puede hacer trabajo mientras está sentada en la silla.
Crear 800 hilos equivale a salir y contratar a 800 personas, y pagarles a cada uno de ellos para que envíen una carta al servidor. Pero solo tienes cuatro sillas, por lo que esas 800 personas deben turnarse para usar las sillas.
Eso sería una solución absurda en la vida real. Los hilos, como las personas, son increíblemente costoso. Debería minimizar el número de subprocesos que crea.
Entonces, ¿deberías crear 800 tareas a través de la fábrica de tareas y dejar que el TPL las paralelice por ti?
No, tampoco deberías hacer eso. El TPL tiene un grupo de personas (hilos) para dibujar, y trata de arreglar las cosas para que no haya más personas en la nómina que sillas para que se sienten. Pero su tarea no es "presidida por la silla" - - las personas se sentarán en la silla, enviarán la solicitud al servidor y luego se levantarán de la silla mientras esperan que vuelva la respuesta. Mientras esperan, el TPL ahora tiene que contratar a más personas para que realicen tareas adicionales.
Golpear un servidor web está vinculado a E/S; solo debe crear tareas agrupadas por subprocesos para tareas que están vinculadas a la CPU.
La solución correcta es contratar dos personas.
Una persona, el "hilo de finalización de E/S", no hace más que dejar solicitudes en el buzón y comprobar si hay paquetes entrantes. La otra persona, la persona de "simulación", determina cuál es el "horario" correcto para simular 800 clientes. La persona de simulación resuelve el programa y luego se va a dormir. Se despierta cuando es el momento de enviar otra solicitud al servidor. Cuando se despierta, le dice al hilo de finalización de E/S que deje caer esta carta en el buzón y la despierte cuando llegue la respuesta. Luego vuelve a dormirse hasta que sea el momento de enviar otra solicitud o una respuesta. viene que necesita ser verificado.
Lo que debe hacer es (1) obtener la versión beta de C# 5 y usar async/await
para crear tareas que envíen solicitudes al servidor y luego devolver el control al bucle de mensajes hasta que sea el momento de enviar otra solicitud o una respuesta entra. O, si no desea utilizar C# 5, debe crear una Fuente de finalización de tarea y configurar las tareas que tienen las continuación correctas.
En resumen: la forma correcta de manejar muchas tareas paralelas de E/S es crear un número muy pequeño de subprocesos, cada uno de los cuales realiza una cantidad muy pequeña de trabajo a la vez. Deje que el subproceso de finalización de E/S maneje los detalles de la E/S. No necesita contratar 800 personas para simular el envío de 800 cartas. Contrate dos personas, una para mirar el buzón y otra para escribir las cartas.
[Ver discusión relacionada aquí] (http://stackoverflow.com/questions/10687850/task-factory-startnew-or-parallel-foreach-for-many-long-running-tasks) –