2010-02-01 23 views
5

Ich habe eine Liste von URLs, und ich mache ein HTTP-Web-Anfrage-Objekt, und versuche, mich damit zu verbinden, ich habe ein 'Array' von URLs, und ich versuche, mit jedem zu verbinden. Das Ziel ist es zu sehen, welche aus sind.Was ist der einfachste Weg, mehrere Webanfragen hintereinander zu tätigen?

Es funktioniert bereits, aber eine Anfrage startet nur, sobald die letzte endet, also ist es ziemlich langsam arbeiten, etwa zwei Anfragen pro Sekunde.

Ich fragte mich, ob ich etwa 5 Threads nebenher im Hintergrund arbeiten sollte, das würde es 5 mal schneller machen, was die gewünschte Geschwindigkeit ist (ohne das gemeinsame Internetband zu überlasten). Aber ich habe zwei Probleme:

1 - ich weiß nicht einmal, ob es die beste Lösung für mein Problem ist. 2 - Ich habe es einige Male versucht, aber ich bin neu in .NET Framework und habe noch nie Multi-Thread verwendet. also weiß ich nicht, wie ich es leicht machen würde.

Ich habe eine Funktion start(), und es hat eine For, die durch alle Überprüfung der Existenz der URL geht.

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

- [Bearbeiten] -

Kann mir jemand sagen (mit Code-Beispiel, wenn möglich), wie fünf (nicht so viele wie möglich) Fäden in Background zu benutzen? Was ist mit dem Start gleich nach der letzten Bearbeitung?

Antwort

1

Dies ist ein idealer Fall für die BackgroundWorker Klasse in .NET. Es verwendet den Thread-Pool, um potenziell lang andauernde Vorgänge im Hintergrund auszuführen, so dass der Aufrufer nicht mit dem einzelnen Code zur Thread-Erstellung umgehen muss.

0

Ich bevorzuge es, eine Worker-Klasse zu erstellen, die die HttpWebRequest ausführt und es für jede Verbindung in einem eigenen Thread startet. Lassen Sie Ihre Worker-Klasse eine Callback-Methode verwenden, um zu signalisieren, dass sie beendet ist. Ich benutze eine Warteschlange von ausstehenden Threads und ein Wörterbuch von aktiven Threads. Threads, die aufgrund neu startbarer Dinge wie Verbindungsfehler und Zeitüberschreitungen vorzeitig beendet werden, können wieder in die Warteschlange gestellt werden. Die ManagedThreadId des Threads ist praktisch, um Threads zu verfolgen.

Sie wahrscheinlich auch von Ihrer App maximale Anzahl der Verbindungen erhöhen möchten, diese zu Ihrem app.config:

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

I 10 als Beispiel gewählt - Sie werden die Auswirkungen auf die experimentieren, um zu sehen Durchsatz, CPU-Auslastung und Speicherauslastung.

+0

Ich verwende derzeit einige Hintergrundarbeiter, und es funktioniert, aber ich bin mir nicht sicher, dass es wirklich so viele Male schnell ist, wie ich Hintergrundarbeiter habe. Ist das "app.config" auch für Windows-Formulare? – Marcelo

+0

Die App.config funktioniert für Winforms. Die standardmäßige maximale Verbindung ist 2 pro IP, was den Effekt von zusätzlichen Hintergrundarbeitern maskieren kann. –

0

Anstatt explizit neue Themen selbst starten, verwenden, um die HttpWebRequest.BeginGetResponse() Methode jede Anforderung asynchron auszuführen, und ein Callback-Verfahren festgelegt wird:

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

bleiben Antwort zu nennen.Schließen Sie() in der Rückrufmethode, damit die maximale Anzahl gleichzeitiger Verbindungen nicht überschritten wird. Dies ist vorzuziehen, die maxconnection Wert der app.config zu erhöhen, die gegen RFC-Richtlinien (max Verbindungen = 2) ist.

Als grobe Richtlinie kann ich mit dieser Methode ungefähr 8 Anfragen pro Sekunde über einen Zeitraum von 5 Sekunden ausführen.

+0

Wie wäre es mit einer Winform-Anwendung, gibt es eine Möglichkeit, Webanfragen zu maximieren? Ich habe 15 Arbeiter (hat alles gemacht, bevor Sie Ihre Antwort geschrieben haben) und es ist nicht 15x schneller .. ich würde sagen, etwa 5 mal. Ist diese maximale Beschränkung der Webrequest-Nummer auf Winform-Anwendungen anwendbar? Wie könnte ich es erhöhen? – Marcelo

+0

Mein Beitrag ist nicht spezifisch für winform- oder Web-Apps - der einzige Unterschied besteht darin, dass Konfigurationsänderungen in app.config (winform) und nicht in web.config übernommen werden. Denken Sie auch daran, dass die Erhöhung der Anzahl der Threads nicht unbedingt einen linearen Leistungszuwachs ergibt, da Sie an andere Einschränkungen gebunden sind (die Threads teilen sich die gleichen Ressourcen wie CPU-Zeit). – Dunc

Verwandte Themen