我有几千个物品。对于每个项目,我需要下载一个网页并处理该网页。处理本身并不占用大量处理器。

现在,我正在使用webclient类同步进行此操作,但是花费的时间太长。我敢肯定,它可以很容易地并行化/异步化。但是Iam正在寻找最节省资源的方法。活动Web请求的数量可能会有一些限制,因此我不喜欢创建数千个Web客户端并在每个客户端上启动异步操作的想法。除非不是实际问题。

是否可以在C#4中使用Parallel Extensions和Task类?

编辑:感谢您的答案。我希望使用异步操作,因为在并行运行同步操作只会阻塞那些线程。

最佳答案

您想使用一种称为生产者/消费者队列的结构。您将所有URL排队等待处理,并分配使用者线程以使每个URL出队(具有适当的锁定),然后下载并处理它。

这使您可以控制和调整使用方数量,以选择最适合您的情况。在大多数情况下,您会发现通过5到20个活动连接可以实现网络操作的最佳吞吐量。更多信息使您开始担心网络上的拥塞问题或线程之间的上下文切换问题。当然,它会根据您的情况而有所不同:具有很多核心和肥大管道的服务器可能能够将此数字推得更高,但是在拨号时使用旧的P4可能会发现它一次只能运行几次才是最好的。这就是调整能力如此重要的原因。

09-25 21:41