5

目前,我有一段代码需要对各种数据提供者进行大约 7 次 Web 服务调用。每个调用都需要几秒钟的时间来执行,所以我想并行运行它们以加快速度。

我已经将我的 7 个调用封装在一个 Parallel.Invoke 中,它非常适合同时运行几件事情,但是在一个 2 核服务器上,它一次只能执行 2 个,每个内核一个。由于我所做的只是等待 Web 服务调用返回,因此我希望它获取所有 7 个并等待它们返回。

有没有办法做到这一点?或者也许我的方法是错误的?也许我需要创建对 Web 服务的异步调用?但是,如何等他们都回来再继续前进呢?

4

4 回答 4

5

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

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

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

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

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

于 2010-09-14T23:04:21.730 回答
1

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

于 2010-09-14T23:05:43.397 回答
0

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

于 2010-09-14T23:04:02.460 回答
0

我将逐字复制我对另一个问题的回答,因为它同样适用于此处,如果不是更多的话。


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

查看 MSDN 上名为TPL 和传统 .NET 异步编程的 .NET SDK 部分,了解有关如何结合这两种编程模型以实现异步必杀技的更多信息。

于 2010-09-15T15:36:16.097 回答