【转】C#多线程环境下调用 HttpWebRequest 并发连接限制

      .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows  7 下默认是2,在服务器操作系统上默认为10. 如果不修改这个并发连接限制,那么客户端同时可以建立的 http 连接数就只有2个或10个。对于一些诸如浏览器或网络蜘蛛的应用,2个或10个并发数量实在太少,大大影响应用的性能。之所以有这个并发连接限制,是因为 http 1.0 和 http 1.1 标准规定并发连接数最大为2. 不过目前主流的浏览器都已经不遵循这个规则了,但 .net framework 依然默认遵循这个规则。

      很多文章说用异步方式访问 HttpWebRequest 可以提高并发性能,但我测试下来,如果不修改这个默认并发连接数,同步或异步方式访问性能都很不好。

调整这个默认并发连接限制的方法很简单

      只要在程序中设置:

            System.Net.ServicePointManager.DefaultConnectionLimit = 512;

      这个值最好不要超过1024。

      我们也可以在app.config 中对最大并发连接数进行设置,方法如下:

<configuration>
<system.net>
<connectionManagement>
<add address = "http://www.google.com" maxconnection = "512" />
<add address = "*" maxconnection = "512" />
</connectionManagement>
</system.net>
</configuration>
 

      修改了这个设置后,并发性能明显提高,从原来每秒钟20次直接上升到每秒钟1000多次。

 

 

 

时间: 2024-09-16 20:02:59

【转】C#多线程环境下调用 HttpWebRequest 并发连接限制的相关文章

web service-AXIS1环境下调用AXIS2服务端问题

问题描述 AXIS1环境下调用AXIS2服务端问题 我的项目现在是用的AXIS1的环境但是想调用AXIS2的服务端.我用的RPC的方式.每次调用都会报出org.apache.axis2.AxisFault: String index out of range: -12的错误.在纯AXIS2的环境下是可以的.我的代码如下 import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.ax

多线程环境下单元测试的问题

问题描述 多线程环境下单元测试的问题 某个函数worker是在多线程环境下运行的,如果要对其进行"单元测试",是不是也要在相应的多线程环境下测试?还是在单线程环境下测试? 解决方案 多线程肯定要在多线程环境下测试,这样才能正确的模拟它的行为 解决方案二: 既然是多线程的,你就要在多线程的一个环境下对它进行测试才是真实的结果. 解决方案三: 首先,你还是需要在单线程下测试,单线程的单元测试对于多线程工况下的代码同样有意义. 其次,你应该做多线程测试,这个可以借助mock一类的框架构造仿真

php-[PHP] wamp环境下。使用PDO连接mysql,能执行查询的sql,不能调用存储过程

问题描述 [PHP] wamp环境下.使用PDO连接mysql,能执行查询的sql,不能调用存储过程 $sql='CREATE PROCEDURE t7() select * from tb_article '; $dbh=new PDO($dsn, 'lms', '123456'); $stmt=$dbh->query('CALL t1()'); // $stmt=$dbh->prepare('CALL t1()'); // $stmt->execute(); if($stmt){ $

jar-weblogic环境下调用接口报错,急,在线等!org.w3c.dom.Node.setUserData

问题描述 weblogic环境下调用接口报错,急,在线等!org.w3c.dom.Node.setUserData 之前在测试环境中测试是可以的,后来部署到正式环境就挂掉了,tomcat下也是正常的.项目的weblogic.xml也配置了优先加载项目的jar包,还是不行. ava.lang.LinkageError: loader constraint violation: when resolving interface method "org.w3c.dom.Node.setUserData

写了一个混合36进制&amp;amp;amp;26进制算法,若要运行在多线程环境下,怎样保证线程安全和性能?

问题描述 packagealgorithm;/***混合进制计数类*其中最高位(仅一位)为26进制(英文字母表示),除最高位外(共N-1位)用36进制([0~9-A-Z])来表示*/publicclassMixBaseCounter{privatestaticfinalStringBufferbase26=newStringBuffer("ABCDEFGHIJKLMNOPQRSTUVWXYZ");privatestaticStringBuffermixBaseStr=newString

用VB编写一个可以在ASP环境下调用的运行CMD命令的组件

有时我们在管理服务器时为了安全起见会禁用Windows Scripting Host,这样能防止某些不法用户利用WSH生成一个WebShell,对服务器造成很大的安全隐患.但如果我们又想禁用WSH,又想使用自己的WebShell用于服务器的管理怎么办呢?这里介绍了一种实现ASP中运行CMD并显示结果的组件编程.希望对大家能有所帮助. 首先我们新建一个ActiveDLL工程,命名为ASPCMD,新建的类命名为CMDShell.在"Project"的"Referenct"

.NET Compact Framework多线程环境下的UI异步刷新

在进行WinCe或者Windows Mobile开发中,通常需要把一些任务提交给工作线程(Worker Thread)完成,当worker thread 线程发生状态变更的时候需要通知UI进程刷新UI,比如一个网络连接程序,Worker Thread线程负责管理WiFi,GPRS或者3G等连接,当连接状态发生改变时候,Worker Thread把更新状态通知UI Thread,而UI Thread更新UI通知用户. 这里常常有个疑问,为什么Worker Thread不直接更新UI,这样更简单直接

Core Data多线程环境下pendingChange引发的排序不对问题

这是一个起初看起来很神奇的问题,大意如下: 有一个Table,展示多个消息会话,这些消息会话按最新消息时间排序: 某种情况下,新收到一条消息,时间展示为最新,但这条消息没有排在最上方. 因为界面上展示的时间是最新的,所以刚开始遇到这个问题的第一反应是看看数据库里面的时间戳是不是正确的,查看后确认时间是最新的没错. 一时陷入了僵局,因为问题很难重现. 所以梳理了下逻辑: 收到新消息,在后台进行处理,执行save动作: Core Data保存后发出消息通知变更,主线程使用NSFetchedResul

重构 Rafy 在多线程环境下数据库连接与事务的构建逻辑