使用.Net Parallel Extensions(Parallel.Invoke)进行多个异步调用?

时间:2010-09-14 22:59:20

标签: .net asynchronous parallel-extensions

目前,我有一段代码需要对各种数据提供者进行大约7次Web服务调用。每个调用都需要几秒钟才能执行,因此我希望并行运行它们以加快速度。

我将7个调用包装在Parallel.Invoke中,它可以同时运行几个东西,但在2核心服务器上,它一次只执行2个,每个核心一个。由于我正在做的就是等待Web服务调用返回,我希望它能够获取所有7并等待它们回来。

有没有办法做到这一点?或许我的方法错了?也许我需要创建对Web服务的异步调用?但接下来如何等待他们全部回来继续前进?

4 个答案:

答案 0 :(得分:5)

  

但在2核服务器上,它一次只执行2个,每个核心一个

我会质疑这一点 - Parallel.Invoke通常会运行比系统核心更多的任务。

话虽如此,如果你正在使用异步方法调用调用,我建议使用Task.Factory.FromAsync(...)来生成七个不同的任务。

这提供了在任务执行时执行其他工作的灵活性,然后在您决定使用结果时调用Task.WaitAll(或Task.WaitAny)。

另一方面,Parallel.Invoke将一直阻塞,直到所有七个完成。

答案 1 :(得分:1)

没有必要使用Parallel.Invoke。您可以继续发出多个异步请求(即HttpWebRequest.BeginGetResponse())。至于完成后通知,你有几个选择。一种简单的方法是在发出第一个请求之前初始化CountdownEvent,然后让主线程在发出请求后等待该事件。异步回调方法在事件完成时发出信号。这样,您可以确保在主线程继续之前完成所有请求。

答案 2 :(得分:0)

您可以指定ParallelOptions以增加并发级别。对于受CPU限制的任务,默认值是合理的,但是您正在处理受I / O限制的任务,因此覆盖该行为是有意义的。

答案 3 :(得分:0)

我将逐字复制a response that I made to another question,因为它同样适用,如果不是更多,也适用于此。


在I / O性能方面,您无法击败异步编程模型(APM)。任何时候你都可以使用它,你应该。幸运的是,任务并行库(TPL)提供了支持,通过the FromAsync factory method将APM工作与“纯”TPL任务相结合。

查看MSDN上名为TPL and Traditional .NET Asynchronous Programming的.NET SDK的这一部分,了解有关如何组合这两种编程模型以实现异步天堂的更多信息。