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-08-07 17:00:52

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

多线程环境下调用 HttpWebRequest 并发连接限制

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

SQLite在多线程环境下的应用

这几天研究了一下SQLite这个嵌入式数据库在多线程环境下的应用,感觉里面的学问还挺多,于是就在此分享一下. AD: 2014WOT全球软件技术峰会北京站 课程视频发布 先说下初衷吧,实际上我经常看到有人抱怨SQLite不支持多线程.而在iOS开发时,为了不阻塞主线程,数据库访问必须移到子线程中.为了解决这个矛盾,很有必要对此一探究竟. 关于这个问题,最权威的解答当然是SQLite官网上的“Is SQLite threadsafe?”这个问答. 简单来说,从3.3.1版本开始,它就是线程安全的了

HttpClient在多线程环境下踩坑总结

问题现场 在多线程环境下使用HttpClient组件对某个HTTP服务发起请求,运行一段时间之后发现客户端主机CPU利用率呈现出下降趋势,而不是一个稳定的状态. 而且,从程序日志中判断有线程处于夯住的状态,应该是被阻塞了. 问题排查 一开始找不到原因,怀疑是多线程并发导致的死锁问题,但是通过代码审查并未定位到任何可能的多线程并发问题. 甚至开始怀疑是否是因为内存资源不够引起JVM频繁GC到导致业务线程被暂停,但是从GC的日志输出结果看,GC是正常的. 于是,进入一种丈二和尚摸不着头脑头脑的状态,

UNIX多线程环境下屏障功能(barrier)浅析

说起屏障这个东西,相信对于大多数朋友来说比较陌生,不过要是说起pthread_join这个函数,相信都比较熟悉.我们通常使用这个函数来等待其它线程结束,例如主线程创建一些线程,这些线程去完成一些工作,而主线程需要去等待这些线程结束.其实pthread_join就实现了一种屏障.我们可以对屏障这样理解,把屏障理解为为了协同线程之间的工作而使得某一具体线程进入等待状态的一种机制.下面我们来看看UNIX为我们提供的一个屏障——barrier. 注:与所有的线程函数一样,使用屏障barrier时需要包含

多线程环境下慎用静态变量

最近在修复一个旧的互联网应用bug,问题是程序有时候会自动拼接参数,比如正确的参数应该是f(\\d)-f(\\d)-f(\\d),而实际情况可能会出现f(\\d)-f(\\d)-f(\\d)-f(\\d)-f(\\d).查找bug的时候,从页面入手,然后研究逻辑处理,url生成规则......不断地调试,实验,应用在线下一切正常,但到了线上就会出现问题.线上页有时候刷新一下则又恢复正常.仔细研究了一下程序的逻辑,发现应该是没问题的.最后在某个地方发现程序调用了静态变量.我们都知道,程序一开始会为

设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题

设计模式--单例模式(Java)--考虑多线程环境下的线程安全问题 一:单例模式概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 二:单例模式的实现方式 特别注意,在多线程环境下,需要对获取对象实例的方法加对象锁(synchronized) 方式一:(懒汉式)程序执行过程中需要这个类的对象,再实例化这个类的对象 步骤: 1.定义静态私有对象 2.构造方法私有化保证在类的外部无法实例化该类的对象 3.定义对外开放的静

多线程环境下的线程不安全问题(1)

在不考虑多线程的情况下,很多类代码都是完全正确的,但是如果放在多线程环境下,这些代码就很容易出错,我们称这些类为 线程不安全类 .多线程环境下使用线程安全类 才是安全的. 下面是一个线程不安全类的例子: public class Account { private Integer balance; public Account(Integer balance) { super(); this. balance = balance; } public Integer getBalance() {

java 在centos6.5+eclipse环境下调用opencv实现sift算法

java 在centos6.5+eclipse环境下调用opencv实现sift算法,代码如下: import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfKeyPoint; import org.opencv.highgui.Highgui; import org.opencv.features2d.*; public class ExtractSIFT{ public static

C++多线程环境下的构造函数

多线程的环境里,我们总不可避免要使用锁.于是一个常见的场景就是: 1 class ObjectWithLock 2 { 3 private: 4 std::mutex mtx_; 5 SomeResType shared_res_; 6 7 public: 8 // Constructor/Destructor 9 … 10 11 void OpOnSharedRes() 12 { 13 std::lock_guard<std::mutex> lock(mtx_); 14 15 // read