平行的.ForEach任务.工厂和N螺纹
本文关键字:螺纹 工厂 任务 ForEach | 更新日期: 2023-09-27 18:03:13
我知道以前有人问过这个问题,但我仍然认为在这种情况下使用什么并不清楚。
我需要对一个web服务进行100次调用,我知道它一次可以处理16个请求(不是说如果它得到更多就会失败)
我认为那是平行的。ForEach用于更低级的CPU密集型调用——它将决定最适合的线程数。的任务。工厂使用线程池,所以可以有少于16个线程(也可以更多)
当然,我可以编写自己的线程池,但是对于这种情况,没有更明显的选择吗?我将使用Parallel.ForEach
,但指定ParallelOptions
, MaxDegreeOfParallelism
设置为16。这样你就非常清楚地表明了你想要的并行度。
如果您使用Task.Factory
,我认为假设您将获得超过16个并发任务是合理的,尽管如果您使用异步IO,您不需要有16个并发的线程。
你可能想看看TPL数据流——我还没有特别关注如何轻松地划分消费者,但由于它直接针对生产者/消费者场景,如果你不能创建16个消费者,然后只产生100个调用,我会感到惊讶。
当然,您也可以创建16个线程,它们都使用包含100个调用数据的相同BlockingCollection
。这将保证并行性的水平…
请注意,为了实际同时对同一HTTP主机进行16次调用,您可能需要调整app.config的<connectionManagement>
部分。