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使用时发生阻塞的解决办法的更多相关文章

  1. HttpWebRequest使用注意(发生阻塞的解决办法)

    原文 http://www.cnblogs.com/Fooo/archive/2008/10/31/1323400.html HttpWebRequest使用注意(发生阻塞的解决办法) , count ...

  2. ElementUI的表单和vee-validate结合使用时发生冲突的解决

    在Vue项目中使用ElementUI表单时,同时又引入了vee-validate进行使用的时候,在浏览器上会出现这样的报错: [Vue warn]: The computed property &qu ...

  3. CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法

    CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法 .recomend-list{ width:1200px; a{ @extend %fl; margin-right: 30px; width ...

  4. selenium + PhantomJS使用时 PhantomJS报错解决

    selenium + PhantomJS使用时 PhantomJS报错解决 在做动态网页爬虫时用到了selenium + PhantomJS,安装好之后运行时报错: UserWarning: Sele ...

  5. 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法

    微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...

  6. 【使用时发生的意外】file is not sufficiently replicated yet

    异常堆栈如下: -- ::, ERROR [com.ultrapower.secsight.util.HdfsUtil] - 追加写入文件失败! org.apache.hadoop.ipc.Remot ...

  7. mysql57重新安装后无法再次启动mysql57服务“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动。”--解决方法

    本地计算机上的MySQL服务启动后停止.某些服务在未由其他服务或程序使用时将自动. (win10,mysql5.7+) 解决方法: 第一步:查看MySQL57安装路径 只要在programData路径 ...

  8. 关于在安装MySQL时报错"本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止"的解决方法

    首先将你下载的MySQL安装或者解压(对应安装版和解压版),下载地址http://dev.mysql.com/downloads/mysql/ 然后复制你安装目录中的my-default.ini,更改 ...

  9. 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(转)

    上面的意识就是你吧值付给了不该赋给的变量,或者说你把值付给了不能付给的变量(或者常量) ()最简单也最直接的错误可能就是scanf()的问题,我们都知道输入的时候都是scanf("%格式&q ...

随机推荐

  1. tcpdump截帧工具使用

    一.tcpdump介绍 ​ tcpdump是Linux下功能强大的截帧工具,相当于windows下的wireshark一下,只是操作方式是命令行的,需要熟悉Linux命令行操作. ​ 常用的Linux ...

  2. Burp Suite Extension tools

    1.Setting up the envrionment for burp Extensions   before we can write extensions we need to ensure ...

  3. SVN提交错误及使用技巧

    错误1: Some of selected resources were not added to version control. Some of selected resources were n ...

  4. ipsec][strongswan] ipsec SA创建失败后的错误处理分析

    〇 ike协商的过程最终是为了SA的建立, SA的建立后, 在底层中管理过程,也是相对比较复杂的. 这里边也经常会出现失败的情况. 我们以strongswan为例, 在strongswan的底层SA管 ...

  5. AD如何改变PCB文件的黑色背景

    第一步:打开AD软件,新建一个PCB文件.   2 第二步:在黑色区域随便画一个封闭的多边形——注意一定要是封闭的!   3 第三步:点击“Ctrl + A”快捷键将PCB整个文件选中.   4 第四 ...

  6. 2.spring的主要模块作用

    spring中大约包含20过个模块, 主要包括以下几部分: 1. Core Container Core Container(核心容器)包含Core,Beans,Context和Expression ...

  7. bind、apply、call的理解

    一直感觉代码中有call和apply就很高大上(看不懂),但是都草草略过,今天非要弄明白!以前总是死记硬背:call.apply.bind 都是用来修改函数中的this,传参时,call是一个个传参, ...

  8. 什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

    只有TCP有粘包现象,UDP永远不会粘包! 粘包:在接收数据时,一次性多接收了其它请求发送来的数据(即多包接收).如,对方第一次发送hello,第二次发送world, 在接收时,应该收两次,一次是he ...

  9. 织梦cms 后台查看会员性别为空

    织梦cms会员注册选择性别为保密时,在后台会员中心查看性别为空的修改方法 第一步:找到dede/templets/member_view.htm,在引号中添加保密就ok 再次修改后的结果

  10. 洛谷 P1082 同余方程 题解

    每日一题 day31 打卡 Analysis 题目问的是满足 ax mod b = 1 的最小正整数 x.(a,b是正整数) 但是不能暴力枚举 x,会超时. 把问题转化一下.观察 ax mod b = ...