1

我知道这已经被问过和讨论过,但我仍然认为在这种情况下使用什么还不清楚。

我需要对我知道一次可以处理 16 个请求的 Web 服务进行 100 次调用(并不是说如果它得到更多它会失败)

我认为 Parallel.ForEach 用于更低级别的 CPU 密集型调用——它将决定有多少线程最适合。Task.Factory 使用线程池,因此可能少于 16 个线程(也更多)

当然,我可以编写自己的线程池,但是对于这种情况,没有更明显的选择吗?

4

1 回答 1

1

我会使用Parallel.ForEach但将 aParallelOptions设置MaxDegreeOfParallelism为 16。这样你就可以非常清楚地表明你想要的并行度。

如果您使用Task.Factory,我认为假设您获得超过 16 个并发任务是合理的,尽管如果您使用异步 IO,则无论如何您都不需要 16 个并发线程。

您可能想查看TPL 数据流- 我没有专门研究如何轻松地对消费者进行分区,但由于它直接针对生产者/消费者场景,如果您无法创建 16 个消费者,我会感到惊讶,然后只需产生 100 个电话。

或者,当然您可以创建 16 个线程,所有线程都BlockingCollection为 100 次调用使用相同的包含数据。这将保证并行度......

请注意,为了实际同时对同一 HTTP 主机进行 16 次调用,您可能需要调整<connectionManagement>app.config 的部分。

于 2013-03-11T09:36:59.073 回答