平行的.ForEach任务.工厂和N螺纹

本文关键字:螺纹 工厂 任务 ForEach | 更新日期: 2023-09-27 18:03:13

我知道以前有人问过这个问题,但我仍然认为在这种情况下使用什么并不清楚。

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

我认为那是平行的。ForEach用于更低级的CPU密集型调用——它将决定最适合的线程数。的任务。工厂使用线程池,所以可以有少于16个线程(也可以更多)

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

平行的.ForEach任务.工厂和N螺纹

我将使用Parallel.ForEach,但指定ParallelOptions, MaxDegreeOfParallelism设置为16。这样你就非常清楚地表明了你想要的并行度。

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

你可能想看看TPL数据流——我还没有特别关注如何轻松地划分消费者,但由于它直接针对生产者/消费者场景,如果你不能创建16个消费者,然后只产生100个调用,我会感到惊讶。

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

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