C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案
最近做接口对接,因需求变化需要用到异步推送信息,就利用委托做了异步。
程序运行过程中时不时出现“正在终止线程”的错误信息,导致两边订单信息不一致,代码如下:
byte[] byteData = Encoding.UTF8.GetBytes(parameters);
HttpWebResponse response=null;
Stream myResponseStream = null;
Stream myRequestStream = null;try
{
var request=(HttpWebRequest) WebRequest.Create(Url);
request.Proxy = null;//不使用代理
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteData.Length; using (myRequestStream = request.GetRequestStream())
{
myRequestStream.Write(byteData, , byteData.Length);
} response = (HttpWebResponse) request.GetResponse();
myResponseStream = response.GetResponseStream();
//将响应流转成xml对象
XmlDocument doc = new XmlDocument();
if (myResponseStream != null)
doc.Load(myResponseStream);
//返回xml对象
return doc;
}
catch (Exception ex)
{
LogHelper.CreateLog("post信息时出错!信息:" + ex.Message, orderid, httpContext);
return null;
}
finally
{
if (myResponseStream != null)
{
myResponseStream.Close();
myResponseStream.Dispose();
}
if (response != null)
{
response.Close();
response.Dispose();
}
if (myRequestStream != null)
{
myRequestStream.Close();
myRequestStream.Dispose();
}
}
网上寻找解决方案,基本上都是Response.Redirect导致的错误。我的代码上面并没有这些玩意儿。。。
实在是无法组织语言了,归根到底的原因就是C#中使用多线程使用HttpWebRequest时,默认的连接数只有2。
然后有时候因为对方服务器的原因导致访问超时,如果没有做超时处理的话,request对象就不会被释放,后面便导致一系列的问题。
解决方法之一就是在调用HttpWebRequest对象之前将连接数改大。
System.Net.ServicePointManager.DefaultConnectionLimit = 24
解决后代码:
byte[] byteData = Encoding.UTF8.GetBytes(parameters);
HttpWebResponse response=null;
Stream myResponseStream = null;
Stream myRequestStream = null;
System.Net.ServicePointManager.DefaultConnectionLimit = ;
try
{
var request=(HttpWebRequest) WebRequest.Create(Url);
request.Proxy = null;//不使用代理
request.KeepAlive = false;//不建立持久性连接
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteData.Length; using (myRequestStream = request.GetRequestStream())
{
myRequestStream.Write(byteData, , byteData.Length);
} response = (HttpWebResponse) request.GetResponse();
myResponseStream = response.GetResponseStream();
//将响应流转成xml对象
XmlDocument doc = new XmlDocument();
if (myResponseStream != null)
doc.Load(myResponseStream);
//返回xml对象
return doc;
}
catch (Exception ex)
{
LogHelper.CreateLog("post信息时出错!信息:" + ex.Message, orderid, httpContext);
return null;
}
finally
{
if (myResponseStream != null)
{
myResponseStream.Close();
myResponseStream.Dispose();
}
if (response != null)
{
response.Close();
response.Dispose();
}
if (myRequestStream != null)
{
myRequestStream.Close();
myRequestStream.Dispose();
}
}
这个个数,有相关说法是CPU的数量*2,具体有待考证,不过已经解决了我的问题。
其他解决方式参考连接:
http://www.cnblogs.com/eaglet/archive/2012/05/18/2507179.html
http://www.cnblogs.com/1971ruru/archive/2012/04/11/2442589.html
http://blog.sina.com.cn/s/blog_3eea4f680100s48d.html
C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案的更多相关文章
- iOS中CollectionView由于多次点击造成错误的解决方案
iOS中CollectionCiew由于多次点击,会给程序造成错误. 这个时候,我们可以用过手势类来进行判断和过滤. 但是,有一个快捷的解决方法,那就是给用户响应增加延时操作. 具体代码如下: [co ...
- asp.net中调用COM组件发布IIS时常见错误 80070005解决方案
很多人在.net开发Web站点中引用了COM组件,调试时一切正常,但一发布到IIS下就提示如下错误: 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005 ...
- 关于js语法(运算中出现无限大的问题)本身的错误的解决方案
错误原因: 一是 JavaScript 浮点数计算的 Bug, 另一个是和计算机最终转换成二进制计算有关系 解决方案: 第一种就是利用JavaScript 的toFixed(n) 方法,直接获取N 位 ...
- ASP.NET sync over async(异步中同步,什么鬼?)
async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...
- VB.NET中网络编程的另一种方案----system.net中的HttpWebRequest类的使用
VB.NET中网络编程的另一种方案---- system.net中的HttpWebRequest类的使用 在VB.net中进行网络编程,除了我之前写的随笔中的使用WinHttp组件进行编程,还有另一种 ...
- C#中使用 HttpWebRequest 向网站提交数据
HttpWebRequest 是 .NET 基类库中的一个类,在命名空间 System.Net 里,用来使用户通过 HTTP 协议和服务器交互. HttpWebRequest 对 HTTP 协议进行了 ...
- 翻译 异步I/O不会创建新的线程
异步I/O不会创建新的线程 本文翻译自 Stephen Cleary 的 [There is No Thread] 原文地址 https://blog.stephencleary.com/2013/1 ...
- Kafka producer异步发送在某些情况会阻塞主线程,使用时候慎重
最近发现一个Kafka producer异步发送在某些情况会阻塞主线程,后来在排查解决问题过程中发现这可以算是Kafka的一个说明不恰当的地方. 问题说明 在很多场景下我们会使用异步方式来发送Kafk ...
- nodejs中使用worker_threads来创建新的线程
目录 简介 worker_threads isMainThread MessageChannel parentPort和MessagePort markAsUntransferable SHARE_E ...
随机推荐
- PyQt5应用与实践
一个典型的GUI应用程序可以抽象为:主界面(菜单栏.工具栏.状态栏.内容区域),二级界面(模态.非模态),信息提示(Tooltip),程序图标等组成.本篇根据作者使用PyQt5编写的一个工具,介绍如何 ...
- 自动更新Chromium
Chromium 其实就是开发版本的Chrome, 即Chrome dev 版本.一般他的版本要比正式版的Chrome高两个及以上.比如正式版本现在是29,开发者版本已经是32了. 这表示很多新功能你 ...
- [Unity3D]再次点击以退出程序
[Unity3D]再次点击以退出程序 本文介绍为Android应用编写点击返回按键时的"再次点击以退出程序"的方法. +BIT祝威+悄悄在此留下版了个权的信息说: 下面是一个测试用 ...
- Atitit 知识图谱的数据来源
Atitit 知识图谱的数据来源 2. 知识图谱的数据来源1 a) 百科类数据2 b) 结构化数据3 c) 半结构化数据挖掘AVP (垂直站点爬虫)3 d) 通过搜索日志(query record ...
- iOS-旧项目中手动内存管理(MRC)转ARC
在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题, ...
- Windows Server 2012部署Enterprise Solution 5.4
最近一个客户升级系统,改用Windows Server 2012作为服务器操作系统.升级之后性能未见明显的改善,在不改变代码的基础上,考虑到C/S架构的能力,增加内存或是处理器的处理能力似乎可以解决一 ...
- hibernate(三)基本配置,log4j、JUnit配置
一.基本配置 1.<property name="hbm2ddl.auto">update</property> 改项配置有4个选项: validate:当 ...
- Android Service小记
Service 是Android 的一种组件,跟线程无关. Service 分两种启动方式 startService()和bindService() 两种都需要在Androidmanifest.xml ...
- 深入理解javascript作用域系列第二篇——词法作用域和动态作用域
× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...
- 【目录】Newlife XCode组件相关文章目录
本博客所有文章分类的总目录链接:本博客博文总目录-实时更新 1.Newlife XCode组件相关文章目录 1.Newlife XCode组件资源目录汇总[2013年版] 2.Newlife ...