在C#中并发下载/处理

Nic*_*ick 2 c# parallel-processing concurrency multithreading task-parallel-library

我正在寻找使用C#同时下载1000个远程网页(使用HttpWebRequest),将它们写入单个本地文件并在下载完所有文件后运行一些处理代码的最快,最可靠的方法,同时充分利用并行性和可以使用非阻塞并发。

该服务器是运行Windows 2008和.NET 4.0的四核(vCPU)VPS(不能使用更新的异步/等待功能)。

你有什么建议?

更新:到目前为止,建议的选项包括:反应性扩展(Rx),异步CTP,TPL。

看起来异步CTP将是理想的方式,其次是Rx和TPL。家伙怎么说?

Dre*_*rsh 5

无论最终使用哪种异步方法,都不要忘记您需要增加允许的最大连接数,因为默认情况下每个域2个。因此,如果您针对一个域进行大量通话,则费率将受到限制。

您可以使用基本配置在独立(非ASP.NET)应用中解决此问题:

<system.net>
   <connectionManagement>
       <add address="*" maxconnections="200" />
   </connectionManagement>
</system.net>
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用的是ASP.NET,则该功能将无法按预期方式工作,因为默认<processModel autoConfig="true" ...>属性会导致其自动配置为每个内核12个,虽然总数超过2个,但仍可能无法满足您的需求。因此,您将不得不在类似于Application_Start的地方使用基于代码的方法:

ServicePointManager.DefaultConnectionLimit = 200;
Run Code Online (Sandbox Code Playgroud)

注意:这种基于代码的方法也适用于非ASP.NET应用程序,因此,如果要避免使用.config,则可以将其用作“通用”解决方案。