Parallel.ForEach,Task.Factory和N个线程

时间:2013-03-11 09:32:08

标签: c# parallel-processing task

我知道之前已经讨论过这个问题,但我认为现在还不清楚在这种情况下使用什么。

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

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

当然我可以编写自己的线程池,但是这个场景不是更明显的选择吗?

1 个答案:

答案 0 :(得分:1)

我会使用Parallel.ForEach但指定ParallelOptions并将MaxDegreeOfParallelism设置为16.这样您就可以清楚地表明所需的并行度。

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

您可能希望看一下TPL Dataflow - 我没有具体考虑如何轻松地对消费者进行分区,但由于它主要针对生产者/消费者场景,如果您无法创建16个消费者,然后只生成100个电话。

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

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