Ich habe eine Liste von URLs von Seiten, die ich gleichzeitig herunterladen möchte mit HttpClient
. Die Liste der URLs groß sein kann (100 oder mehr!)Begrenzen gleichzeitiger Anfragen mit Rx und SelectMany
Ich habe derzeit haben diesen Code:
var urls = new List<string>
{
@"http:\\www.amazon.com",
@"http:\\www.bing.com",
@"http:\\www.facebook.com",
@"http:\\www.twitter.com",
@"http:\\www.google.com"
};
var client = new HttpClient();
var contents = urls
.ToObservable()
.SelectMany(uri => client.GetStringAsync(new Uri(uri, UriKind.Absolute)));
contents.Subscribe(Console.WriteLine);
Das Problem: aufgrund der Verwendung von SelectMany
, ein großes Bündel von Aufgaben werden erstellt fast zur gleichen Zeit. Es scheint, dass, wenn die Liste der URLs groß genug ist, viele Aufgaben Timeouts geben (ich bekomme "Eine Aufgabe wurde abgebrochen" Ausnahmen).
Also dachte ich, es sollte einen Weg geben, vielleicht mit einer Art von Scheduler, um die Anzahl der gleichzeitigen Aufgaben zu begrenzen, nicht mehr als 5 oder 6 zu einem bestimmten Zeitpunkt zuzulassen.
Auf diese Weise konnte ich gleichzeitige Downloads erhalten, ohne zu viele Aufgaben zu starten, die möglicherweise zum Stillstand kommen, wie sie es gerade jetzt tun.
Wie geht das, damit ich nicht mit vielen zeitgesteuerten Aufgaben sättigen?
Vielen Dank.
Sie könnten die [Dataflow] betrachten möchten, mit (https://msdn.microsoft.com/en-us/library/hh228603%28v= vs.110% 29.aspx) API. –
Können Sie es mit meinem Code integrieren? Ich ignoriere, wie man es mit DataFlow macht. TBH, ich habe es nie benutzt, aber eine Probe zu betrachten würde mir sehr helfen. – SuperJMN