【前置条件】
开启1000个线程,每一个线程执行一个http请求
List<taskList> list=new List<taskList>();
//监测线程的方法
Task.Run(() => monitorTask());
//开启线程 - 一条记录一个线程
var tasks = taskList.Select(m =>
{
return Task.Run(() => taskWay(m));
});
Task.WhenAll(tasks);
【超时情况】
HttpWebRequest request = null;
request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "GET";
//请求数据为json格式字符串数据
request.ContentType = "application/json;charset=UTF-8";
//关闭长连接
request.KeepAlive = false;
//模拟用户请求设备信息 - chrome
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13";
//请求超时时间
request.Timeout=100*1000; //请求超时前等待的毫秒数。 默认值是 100,000 毫秒(100 秒)。
//获取请求响应信息 - gb2312/utf-8
string content="";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
using (StreamReader sr = new StreamReader(response.GetResponseStream(), 'gb2312'))
{
content = sr.ReadToEnd();
sr.Close();
sr.Dispose();
response.Close();
}
//特别要注意的地方 - request和response是同时使用的,如果Request.Abort的话,那么Response读取值会报错,所以request取消时要在response完成之后
if (response != null)
{
response.Close();
}
if (request != null)
{
request.Abort();
}
【解决超时代码】
ServicePointManager.DefaultConnectionLimit = 10*1000;
不知道为啥,最后一个http请求成功没有被监控到
温馨提示:请求超时,代码逻辑上虽然判断是http请求失败,但是也有可能是http请求操作成功,比如添加数据添加成功了,返回信息却是超时的情况
设置100万并发,在1个半小时依然出现超时的情况。所以,如果不是准备数据的情况下,那么可以设置有一定规律时间内并发也许解决超时的情况。
原因
【思路错误】
思路错误了,得出错误结论,方案自然也是错误的
其实上面出现超时,再设置100万个并发限制,这个方式是不合理的,方向不对。超时,说明是服务器端,比如IIS对累计太多的http请求响应不过来
【合理设计】
1)客户端,一般按量来调整并发数量,500到1000都可以了
2)服务端,看服务器硬件等配置,IIS连接数的最大支持数
客户端和服务端之间设计一个合理范围,这样才不会出现服务端响应不过来的情况。
第一次出现不合理的情况,由于没理解到位,一直调整客户端的并发数从10万到100万,其实是没有意义的,因为这样只会提高,发送出去的http请求数量,但是服务器响应不过来,可能处理请求5个每秒,累计连接数量在900多,其他连接都在排队,等长时间没反应自然就出现超时的情况或者服务端异常情况。
【实现流程图】
总结:只有理解了其中的原理和逻辑,才能设计出合理的方案!生活中,任何事情都是这样的道理!每天进步一点点,你就是最棒的!