HttpWebRequest使用时发生阻塞的解决办法
HttpWebRequest使用如下:
第一种:使用Using 释放资源
/// <summary>
/// Http Get请求返回数据
/// </summary>
/// <param name="url">Http请求URL</param>
/// <returns>返回Http请求的结果</returns>
public string HttpGetMethod(string url, int timeOut = )
{
string strResult = null;
try
{
if (string.IsNullOrEmpty(url))
{
return null;
}
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = timeOut * ;
using (HttpWebResponse wb = (HttpWebResponse)request.GetResponse())
{
using (Stream stream = wb.GetResponseStream())
{
using (StreamReader streamReader = new StreamReader(stream, Encoding.UTF8))
{
strResult = streamReader.ReadToEnd();
}
}
}
}
catch (Exception ex)
{
throw;//LoggerService.Log.Error($"Http Get请求{url}返回数据失败,原因:{ex.ToString()}");
}
return strResult;
}
第二种:使用close 释放资源
/// <summary>
/// Http Get请求返回数据
/// </summary>
/// <param name="url">Http请求URL</param>
/// <returns>返回Http请求的结果</returns>
public string HttpGetMethod2(string url, int timeOut = )
{
if (string.IsNullOrEmpty(url))
{
return null;
}
HttpWebRequest request = null;
HttpWebResponse response = null;
Stream streamReceive = null;
StreamReader streamReader = null;
string strResult = null;
try
{
request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = timeOut * ;
ServicePointManager.DefaultConnectionLimit = ;
response = (HttpWebResponse)request.GetResponse();
streamReceive = response.GetResponseStream();
streamReader = new StreamReader(streamReceive, Encoding.UTF8);
strResult = streamReader.ReadToEnd();
streamReader.Close();
streamReader.Dispose();
streamReceive.Close();
streamReceive.Dispose();
response.Close();
request.Abort();
}
catch (Exception ex)
{
throw;// LoggerService.Log.Error($"Http Get请求{url}返回数据失败,原因:{ex.ToString()}");
}
finally
{
if (streamReader != null)
{
streamReader.Close();
streamReader.Dispose();
}
if (streamReceive != null)
{
streamReceive.Close();
streamReceive.Dispose();
}
if (response != null)
{
response.Close();
} }
return strResult;
}
HttpWebRequest使用的2种基本写法,各种response,streamReceive ,streamReader 资源都释放了,看似没有什问题,其实只要写个while死循环,每次都去请求,你会发现,运行不了几次就阻塞了,原因很简单就是还有个HttpWebRequest对象没有释放,其实很多时候释放了Stream和Response还远远不够,客户端的Request还是在保持着,无法及时释放占有的资源,而是需要Net的GC.Collect()系统垃圾回收器来回收,因此无法保证资源的及时释放,所以一般很容易阻塞,就会出现上次的请求在处理,导致本次请求发送不出去。HttpWebRequest及时释放就是让HttpWebRequest在不需要的时候及时释放资源,这样可以重复使用而不会阻塞。
在程序的finally中添加下面这句就ok了。
if (request != null)
{
request.Abort();
}
HttpWebRequest使用时发生阻塞的解决办法的更多相关文章
- HttpWebRequest使用注意(发生阻塞的解决办法)
原文 http://www.cnblogs.com/Fooo/archive/2008/10/31/1323400.html HttpWebRequest使用注意(发生阻塞的解决办法) , count ...
- ElementUI的表单和vee-validate结合使用时发生冲突的解决
在Vue项目中使用ElementUI表单时,同时又引入了vee-validate进行使用的时候,在浏览器上会出现这样的报错: [Vue warn]: The computed property &qu ...
- CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法
CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法 .recomend-list{ width:1200px; a{ @extend %fl; margin-right: 30px; width ...
- selenium + PhantomJS使用时 PhantomJS报错解决
selenium + PhantomJS使用时 PhantomJS报错解决 在做动态网页爬虫时用到了selenium + PhantomJS,安装好之后运行时报错: UserWarning: Sele ...
- 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法
微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...
- 【使用时发生的意外】file is not sufficiently replicated yet
异常堆栈如下: -- ::, ERROR [com.ultrapower.secsight.util.HdfsUtil] - 追加写入文件失败! org.apache.hadoop.ipc.Remot ...
- mysql57重新安装后无法再次启动mysql57服务“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动。”--解决方法
本地计算机上的MySQL服务启动后停止.某些服务在未由其他服务或程序使用时将自动. (win10,mysql5.7+) 解决方法: 第一步:查看MySQL57安装路径 只要在programData路径 ...
- 关于在安装MySQL时报错"本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止"的解决方法
首先将你下载的MySQL安装或者解压(对应安装版和解压版),下载地址http://dev.mysql.com/downloads/mysql/ 然后复制你安装目录中的my-default.ini,更改 ...
- 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(转)
上面的意识就是你吧值付给了不该赋给的变量,或者说你把值付给了不能付给的变量(或者常量) ()最简单也最直接的错误可能就是scanf()的问题,我们都知道输入的时候都是scanf("%格式&q ...
随机推荐
- IDEA设置项目文件自动Add到Svn/Git
1)配置自动Add 2)将未添加的文件添加到本地 3)取消已经添加的文件
- SCADA系统构架的安全分析总结
概念: SCADA 数据采集与监控 Supervisory Control And Data Acquisition .包括了计算机设备 工业控制组件 网络 组成部件 ,SCADA 系统被用 ...
- LGOJP2831 愤怒的小鸟
题目链接 题目链接 题解 数据范围显然状压/爆搜. 考虑\(f[S]\)表示二进制下已打了的猪的集合. 可以枚举\(S\)的子集\(S_1\),判定\(S\)中\(S_1\)的补集\(S_2\)是否合 ...
- JavaScript和JQuery之战再续
之前写过关于JavaScript和Jquery的之间的比较,现在再看比较偏向于理论知识,还不是很理解.经过这一段时间的项目的锻炼,对JQuery有了新的认识. 原生JavaScript和jQuery的 ...
- 深入理解flask 笔记
===sqlalchemy创建的数据模型中:1 字段是类属性 [模型中定义的字段是类属性,表单中定义的字段也是类字段] 2 若数据库不支持bool类型,则sqlalchemy会自动将bool转成0 ...
- docker 进程 转载:https://www.cnblogs.com/ilinuxer/p/6188303.html
今天我们会分析Docker中进程管理的一些细节,并介绍一些常见问题的解决方法和注意事项. 容器的PID namespace(名空间) 在Docker中,进程管理的基础就是Linux内核中的PID名空间 ...
- 多线程实现的方式一继承Thread
实现方法一:继承Thread类 package thread; /** * @function 多线程继承Thread类 * @author hj */ public class Threads ex ...
- 多线程执行sql报错处理
pymysql多线程访问数据库报错:Packet sequence number wrong - got 7 expected 2 原文:https://www.cnblogs.com/heiao10 ...
- 002_基础电路_AD快捷键
AD快捷键设置 陆小果哥哥制作 1. F2----------------------------------------放置走线 a) b) 需设置,点中走线按住 ...
- spark yarn 提交作业
spark提交作业命令: ./spark-submit --master yarn --deploy-mode cluster --class com.zjlantone.hive.SparkOper ...