2010-02-01 16 views
5

Tengo una lista dada de URL, y hago un objeto de solicitud web HTTP, y trato de conectarme con él, tengo una 'serie' de url e intento conectarme con cada uno. el objetivo es ver cuáles están afuera.¿Cuál es la forma más fácil de hacer varias solicitudes web seguidas?

Ya funciona, pero una solicitud solo comienza tan pronto como finaliza la última, por lo que es bastante lento, aproximadamente dos solicitudes por segundo.

Me preguntaba si debería hacer que unos 5 hilos funcionen en segundo plano, eso lo haría 5 veces más rápido, que es la velocidad deseada (sin sobrecargar la banda compartida de Internet). Pero tengo dos problemas:

1 - Ni siquiera sé SI es la mejor solución para mi problema. 2 - lo he intentado algunas veces, pero soy nuevo en .NET framework, y nunca he usado multi-thread. así que no sé cómo lo haría fácilmente.

Tengo una función start(), y tiene un For que recorre toda la existencia de comprobación de la url.

datos: VS 08, .NET 3.5, C#.

- [editar] -

¿Puede alguien decirme (con la muestra de código si es posible) el uso de cinco (no tantos como sea posible) los hilos en BackgroundWorker? ¿Qué tal comenzar justo después de que finaliza el último procesamiento?

Respuesta

1

Este es un caso ideal para la clase BackgroundWorker en .NET. Utiliza el grupo de subprocesos para ejecutar operaciones potencialmente de larga duración en segundo plano, por lo que la persona que llama no tiene que ocuparse de un código de creación de subprocesos individual.

0

Prefiero crear una clase de trabajador que haga el HttpWebRequest y lo inicie en su propio hilo para cada conexión. Haga que su clase de trabajadores use un método de devolución de llamada para indicar que está terminado. Uso una cola de hilos pendientes y un diccionario de hilos activos. Los hilos que terminan prematuramente debido a cosas reiniciables como fallas de conexión y tiempos de espera pueden volver a colocarse en la cola. El ManagedThreadId del subproceso es útil para realizar un seguimiento de los hilos.

Probablemente también quiere aumentar el número máximo de conexiones de su aplicación mediante la adición de esto a su app.config:

<system.net> 
    <connectionManagement> 
     <remove address="*"/> 
     <add address="*" maxconnection="10" /> 
    </connectionManagement> 
    </system.net> 

he elegido 10 como un ejemplo - que tendrá que experimentar para ver el efecto sobre la rendimiento, uso de CPU y uso de memoria.

+0

Actualmente estoy usando algunos backgroundworkers, y está funcionando, pero no estoy seguro de que sea realmente tan rápido como tengo backgroundworkers. ¿Es este "app.config" para la aplicación de formularios de Windows también? – Marcelo

+0

App.config funciona para winforms. La conexión máxima predeterminada es 2 por IP, lo que puede enmascarar el efecto de trabajadores en segundo plano adicionales. –

0

En lugar de empezar nuevos temas de forma explícita a sí mismo, utilice el método HttpWebRequest.BeginGetResponse() para ejecutar cada solicitud de forma asíncrona, y especificando un método de devolución de llamada:

http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/

recuerde llamar respuesta.Close() en el método de devolución de llamada para que no se exceda el número máximo de conexiones simultáneas. Esto es preferible a aumentar el maxconnection valorar el app.config, que está en contra de las pautas de RFC (max connections = 2).

Como una guía aproximada, puedo ejecutar alrededor de 8 solicitudes por segundo durante un período de 5 segundos con este método.

+0

¿Qué hay de una aplicación winform? ¿Hay alguna forma de maximizar webrequests? Puse a 15 trabajadores (lo hice todo antes de publicar su respuesta) y no es 15 veces más rápido. Diría unas 5 veces. ¿Es esta limitación máxima del número de webrequest aplicable a la aplicación winform? ¿cómo podría levantarlo? – Marcelo

+0

Mi publicación no es específica de winform o aplicaciones web; la única diferencia es que cualquier cambio de configuración se realizará en app.config (winform) en lugar de web.config. Recuerde también que aumentar el número de subprocesos no necesariamente le dará una ganancia de rendimiento lineal, ya que está sujeto a otras restricciones (los subprocesos comparten los mismos recursos, como el tiempo de CPU). – Dunc

Cuestiones relacionadas