【发布时间】:2021-01-07 14:24:07
【问题描述】:
我触发任务以下载多个 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 出现在列表的开头就给予优惠。
因此我们试图考虑是否可以分叉 4 个主要任务,将 URL 列表分成 500 个(可能更易于管理),然后使用上面的代码。但是,我无法找到一种方法来引入它,而不必在上面的代码中重写太多。非常感谢任何帮助。
编辑:
类似这样的:
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。发布更新的问题。
标签: vb.net multithreading asynchronous async-await task-parallel-library