2013-03-11 98 views
1

我知道这已被要求之前讨论过,但我仍然认为,目前还不清楚在这种情况下使用什么。Parallel.ForEach,Task.Factory和N个线程

我需要对一个Web服务,我知道可以同时处理16个请求

我认为Parallel.ForEach是更多的(不,它会如果它获得了更多失败)100元话费低水平的CPU密集型调用 - 它将决定最适合的线程数。 Task.Factory使用线程池,以便有可能少于16个线程(也更多)

关当然,我可以写我自己的线程池,但是不存在对于这种情况更加明显的选择?

+0

你已经在线程的思维出了问题。理想情况下,您将使用其中一个异步API来发出请求。 ..在这种情况下,您可以使用.net ThreadPool中的相当少的线程轻松地处理响应。我会考虑从手头的任务中稍作休息,花点时间研究c#5/.net4.5引入的异步/等待范例 – spender 2013-03-11 09:36:43

回答

1

我会用Parallel.ForEach,但指定一个ParallelOptionsMaxDegreeOfParallelism设置为16.这样你就可以非常清楚地表明你想要的并行度。

如果使用Task.Factory我认为这是合理的假设,你获得超过16级并发的任务,但如果你使用异步IO你不必有16个并发线程反正

你可能想看看TPL Dataflow - 我没有你是多么容易划分消费者特意看了,但因为它是在生产者/消费者场景旨在正视,我会感到惊讶,如果你不能创建16个消费者,然后只产生100个电话。

,当然您也可以创建16个线程,所有的消费为100元话费相同BlockingCollection包含数据。这将保证并行性的水平...

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