C# Parallel.ForEach、Task.Factory和N个线程
我知道之前已经有人问过并讨论过这个问题,但我仍然认为不清楚在这个场景中使用什么 我需要对一个我知道一次可以处理16个请求的web服务进行100次调用(并不是说如果它得到更多的请求就会失败) 我认为Parallel.ForEach适用于更低级别的CPU密集型调用—它将决定最适合多少线程。工厂使用线程池,因此线程数可以少于16个(也可以更多)C# Parallel.ForEach、Task.Factory和N个线程,c#,parallel-processing,task,C#,Parallel Processing,Task,我知道之前已经有人问过并讨论过这个问题,但我仍然认为不清楚在这个场景中使用什么 我需要对一个我知道一次可以处理16个请求的web服务进行100次调用(并不是说如果它得到更多的请求就会失败) 我认为Parallel.ForEach适用于更低级别的CPU密集型调用—它将决定最适合多少线程。工厂使用线程池,因此线程数可以少于16个(也可以更多) 当然,我可以编写自己的线程池,但是对于这个场景,没有更明显的选择吗?我会使用Parallel.ForEach,但指定一个MaxDegreeOfParallel
当然,我可以编写自己的线程池,但是对于这个场景,没有更明显的选择吗?我会使用
Parallel.ForEach
,但指定一个MaxDegreeOfParallelism
设置为16的线程池。这样,您就可以非常清楚地表示您想要的并行度
如果您使用Task.Factory
我认为假设您将获得超过16个并发任务是合理的,尽管如果您使用异步IO,您不需要16个并发线程
你可能想看看-我没有特别注意到划分消费者有多容易,但由于它直接针对生产者/消费者场景,如果你不能创建16个消费者,然后只生成100个电话,我会感到惊讶
当然,您也可以创建16个线程,所有线程都使用相同的包含100个调用数据的线程。这将保证并行性的水平
请注意,为了实际同时对同一HTTP主机进行16次调用,您可能需要调整app.config的部分。我将使用
Parallel.ForEach
,但指定一个MaxDegreeOfParallelism
设置为16的值。这样,您就可以非常清楚地表示您想要的并行度
如果您使用Task.Factory
我认为假设您将获得超过16个并发任务是合理的,尽管如果您使用异步IO,您不需要16个并发线程
你可能想看看-我没有特别注意到划分消费者有多容易,但由于它直接针对生产者/消费者场景,如果你不能创建16个消费者,然后只生成100个电话,我会感到惊讶
当然,您也可以创建16个线程,所有线程都使用相同的包含100个调用数据的线程。这将保证并行性的水平
请注意,为了实际同时对同一HTTP主机进行16次调用,您可能需要调整app.config的部分。您已经在线程方面犯了错误。理想情况下,您应该使用一个异步API使请求。。在这种情况下,您可以使用.net线程池中相当少的线程轻松地为响应提供服务。我会考虑从手头的任务中稍作休息,花些时间研究C/5/NET4.5所介绍的异步/等待范例。理想情况下,您应该使用一个异步API使请求。。在这种情况下,您可以使用.net线程池中相当少的线程轻松地为响应提供服务。我会考虑从手头的任务中稍作休息,花些时间研究C/5/NET4.5引入的异步/等待范例。