複数のURLをダウンロードするためのタスクを起動します。並行タスクを実行するためのリストの分割
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)
companies
リストには2000種類のURLが含まれています。私は、リストの終わりに向かって追加されたURLがより頻繁にタイムアウトすることを観察しています。私は再試行論理を整えておき、次の試行でURLをダウンロードするこのタイムアウト状況を処理しています。しかし、リストの先頭に表示されているだけなので、URLに優遇措置を取る必要はありません。
URLリストをチャンクする4つのメインタスクをそれぞれ500個(おそらくもっと管理しやすい)にして、上記のコードを使用できるかどうかを考えようとしていました。しかし、上記のコードであまり書き換えなくても、それを紹介する方法を見つけることはできません。どんな助けでも大歓迎です。
EDIT:もっとこのような
何か:
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
これは、最小限のコード変更であるが、問題は、私はParallel.ForEach
内Await
を使用することができないということです。
これを変更するには、どんな提案もあります。
さらに、Parallel.ForEachをパーティションで使用するようなものです。更新された質問を投稿する。 – Kallol