Ich befehle Tasks zum Herunterladen mehrerer URLs.Partitionieren von Listen zum Ausführen paralleler Tasks
Dim downloadTasksQuery As IEnumerable(Of Task(Of Boolean)) =
From company In companies Select DownloadCompanyFromYahooAsync(company, numberOfDays)
' ***Use ToList to execute the query and start the download tasks.
Dim downloadTasks As IEnumerable(Of Task(Of Boolean)) = downloadTasksQuery.ToList()
Await Task.WhenAll(downloadTasks)
Die companies
Liste enthält eine Art von 2000 URLs. Ich beobachte, dass URLs, die am Ende der Liste hinzugefügt werden, häufiger Zeitüberschreitung verursachen. Ich habe Logiken erneut versucht und bearbeite diese Timeout-Situation, die die URL beim nächsten Versuch herunterlädt. Ich möchte jedoch keine URL bevorzugt behandeln, nur weil sie am Anfang der Liste erscheint.
Daher wurde versucht zu denken, ob wir 4 Hauptaufgaben Gabelung der URL-Liste in jeweils 500 (wahrscheinlich besser handhabbar) und verwenden Sie den obigen Code. Ich bin jedoch nicht in der Lage, einen Weg zu finden, dies einzuführen, ohne im obigen Code zu viel schreiben zu müssen. Jede Hilfe wird sehr geschätzt.
EDIT:
Etwas mehr wie folgen aus:
Dim chunkPart As OrderablePartitioner(Of Tuple(Of Integer, Integer)) = Partitioner.Create(1, companies.Count, 500)
Parallel.ForEach(chunkPart, Sub(chunkRange)
For i As Integer = chunkRange.Item1 To chunkRange.Item2 - 1
Dim downloadTasksQuery As IEnumerable(Of Task(Of Boolean)) =
From company In companies.Skip(chunkRange.Item1).Take((chunkRange.Item2 - chunkRange.Item1) + 1) Select DownloadCompanyFromYahooAsync(company, numberOfDays)
Dim downloadTasks As IEnumerable(Of Task(Of Boolean)) = downloadTasksQuery.ToList()
Await Task.WhenAll(downloadTasks)
Next
End Sub
Dies ist mit minimalen Änderungen am Code, aber das Problem ist, dass ich nicht Await
in einem Parallel.ForEach
verwenden kann.
Alle Vorschläge, um dies zu ändern.
Etwas mehr wie Parallel.ForEach mit einer Partition verwenden. Eine aktualisierte Frage veröffentlichen. – Kallol