我知道这已经被问过和讨论过,但我仍然认为在这种情况下使用什么还不清楚。
我需要对我知道一次可以处理 16 个请求的 Web 服务进行 100 次调用(并不是说如果它得到更多它会失败)
我认为 Parallel.ForEach 用于更低级别的 CPU 密集型调用——它将决定有多少线程最适合。Task.Factory 使用线程池,因此可能少于 16 个线程(也更多)
当然,我可以编写自己的线程池,但是对于这种情况,没有更明显的选择吗?
我知道这已经被问过和讨论过,但我仍然认为在这种情况下使用什么还不清楚。
我需要对我知道一次可以处理 16 个请求的 Web 服务进行 100 次调用(并不是说如果它得到更多它会失败)
我认为 Parallel.ForEach 用于更低级别的 CPU 密集型调用——它将决定有多少线程最适合。Task.Factory 使用线程池,因此可能少于 16 个线程(也更多)
当然,我可以编写自己的线程池,但是对于这种情况,没有更明显的选择吗?
我会使用Parallel.ForEach
但将 aParallelOptions
设置MaxDegreeOfParallelism
为 16。这样你就可以非常清楚地表明你想要的并行度。
如果您使用Task.Factory
,我认为假设您将获得超过 16 个并发任务是合理的,尽管如果您使用异步 IO,则无论如何您都不需要 16 个并发线程。
您可能想查看TPL 数据流- 我没有专门研究如何轻松地对消费者进行分区,但由于它直接针对生产者/消费者场景,如果您无法创建 16 个消费者,我会感到惊讶,然后只需产生 100 个电话。
或者,当然您可以创建 16 个线程,所有线程都BlockingCollection
为 100 次调用使用相同的包含数据。这将保证并行度......
请注意,为了实际同时对同一 HTTP 主机进行 16 次调用,您可能需要调整<connectionManagement>
app.config 的部分。