最近做接口对接,因需求变化需要用到异步推送信息,就利用委托做了异步。

程序运行过程中时不时出现“正在终止线程”的错误信息,导致两边订单信息不一致,代码如下:

       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出现的“正在终止线程”错误的解决方案的更多相关文章

  1. iOS中CollectionView由于多次点击造成错误的解决方案

    iOS中CollectionCiew由于多次点击,会给程序造成错误. 这个时候,我们可以用过手势类来进行判断和过滤. 但是,有一个快捷的解决方法,那就是给用户响应增加延时操作. 具体代码如下: [co ...

  2. asp.net中调用COM组件发布IIS时常见错误 80070005解决方案

    很多人在.net开发Web站点中引用了COM组件,调试时一切正常,但一发布到IIS下就提示如下错误: 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005 ...

  3. 关于js语法(运算中出现无限大的问题)本身的错误的解决方案

    错误原因: 一是 JavaScript 浮点数计算的 Bug, 另一个是和计算机最终转换成二进制计算有关系 解决方案: 第一种就是利用JavaScript 的toFixed(n) 方法,直接获取N 位 ...

  4. ASP.NET sync over async(异步中同步,什么鬼?)

    async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...

  5. VB.NET中网络编程的另一种方案----system.net中的HttpWebRequest类的使用

    VB.NET中网络编程的另一种方案---- system.net中的HttpWebRequest类的使用 在VB.net中进行网络编程,除了我之前写的随笔中的使用WinHttp组件进行编程,还有另一种 ...

  6. C#中使用 HttpWebRequest 向网站提交数据

    HttpWebRequest 是 .NET 基类库中的一个类,在命名空间 System.Net 里,用来使用户通过 HTTP 协议和服务器交互. HttpWebRequest 对 HTTP 协议进行了 ...

  7. 翻译 异步I/O不会创建新的线程

    异步I/O不会创建新的线程 本文翻译自 Stephen Cleary 的 [There is No Thread] 原文地址 https://blog.stephencleary.com/2013/1 ...

  8. Kafka producer异步发送在某些情况会阻塞主线程,使用时候慎重

    最近发现一个Kafka producer异步发送在某些情况会阻塞主线程,后来在排查解决问题过程中发现这可以算是Kafka的一个说明不恰当的地方. 问题说明 在很多场景下我们会使用异步方式来发送Kafk ...

  9. nodejs中使用worker_threads来创建新的线程

    目录 简介 worker_threads isMainThread MessageChannel parentPort和MessagePort markAsUntransferable SHARE_E ...

随机推荐

  1. FusionCharts简单教程(二)-----使用js加载图像和setDataXML()加载数据

          前面一篇对FusionCharts进行了一个简单的介绍,而且建立了我们第一个图形,但是那个是在HTML中使用<OBJECT>和<EMBED>标记来加载图形的,但是这 ...

  2. IOS上架流程

    来个简易版本的.此版本针对用于初次上架的MAC以及在别的本上上架过,但是新换MAC但不换开发者帐号的MAC. 1:首先确认本机没有老旧的开发和distribution证书,有的话,删除: 2:在本机打 ...

  3. svn 忽略文件不管用

    svn 不能对已添加过版本控制的文件进行忽略.于是乎,你会发先,你怎么忽略都不起作用.于是乎,该怎么办? svn忽略已添加到版本库文件或文件夹步骤: 将要忽略的文件或文件夹剪切到非工作拷贝目录. 在父 ...

  4. Java中MVC详解以及优缺点总结

     概念:  MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务数据.逻辑.界面显示分离的 ...

  5. paip.2013年技术趋势以及热点 v2.0 cae

    paip.2013年技术趋势以及热点 v2.0 cae HTML5 多核编程 物联网 可穿戴计算设备 3. 物联网 无论是M2M(机器对机器)通信应用,还是NFC(进距离通信)技术,都是物联网的组成部 ...

  6. linux安装locust

    linux安装locust 1. 安装epel扩展源(目的是为了在安装Pip时不出现一堆乱七八糟的错误信息) EPEL(http://fedoraproject.org/wiki/EPEL) 是由 F ...

  7. Win10下PB停在欢迎窗口界面

    问题:Win10下不能打开PB12.5,PB12.6,一直停在欢迎窗口界面. 解决方法:把服务"Touch Keyboard and Handwriting Panel Service&qu ...

  8. MyEclipse在搭建s2sh时 如何 uninstalled facet

    在资源管理器中:找到当前[项目的根目录],在[.setting]目录中, 找到[org.eclipse.wst.common.project.facet.core.xml]文件. 用[文本编辑器工具] ...

  9. 拓扑排序(一)之 C语言详解

    本章介绍图的拓扑排序.和以往一样,本文会先对拓扑排序的理论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑 ...

  10. xdotool模拟击键和鼠标移动

    最近双十一抢红包的活动比较火,我也就去玩了一下,在一个小活动里,需要不停的点击左箭头和右箭头,让红包不停的跑,但自己点的比较慢,老是出现下面的图片 看到提示还有n多公里才跑完,感觉极度不爽,一怒之下, ...