线程那些坑 - HttpContext
之前记录Log的时候,直接把经常用过的Log帮助类拷贝过来直接用,其中日志的填写路径要么是固定值,然后读取配置文件,要么就是用上下文动态获 System.Web.HttpContext.Current.Server.MapPath() ,正常情况下没什么问题,但是当用到线程时,这里获取到路径便是null,会直接运行错误,线程中,程序无法读取Current 对象值,所以解决办法要什么就是用固定路径,要么就是
- string directPath = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Log";
- if (!Directory.Exists(directPath)) //判断文件夹是否存在,如果不存在则创建
- {
- Directory.CreateDirectory(directPath);
- }
- directPath += string.Format(@"\{0}.log", DateTime.Now.ToString("yyyy-MM-dd"));
这种方式便可以解决动态路径的问题,比较好排查,一运行就会有异常,第一时间找到问题所在,还有一种情况,就比较坑爹了
- public void Index()
- {
- Task.Factory.StartNew(ReseiveCardMes);
- }
- //接收回调数据转为字符串
- public void ReseiveCardMes()
- {
- try
- {
- //接收回调过来的数据
- Stream s = Request.InputStream;
- s.Position = ;
- int count = ;
- byte[] buffer = new byte[];
- StringBuilder builder = new StringBuilder();
- while ((count = s.Read(buffer, , )) > )
- {
- builder.Append(Encoding.UTF8.GetString(buffer, , count));
- }
- s.Flush();
- s.Close();
- s.Dispose();
- var res = builder.ToString();
- if (res.Length > )
- {
- DealHelper deal = new DealHelper();
- deal.Buess(res);
- }
- }
- catch (Exception ex)
- {
- LogHelper.LogQueue.Enqueue("操作失败:" + ex.Message + "--" + ex.ToString());
- }
- }
乍然看去,正常,之前没有捕捉异常,后台数据也有收到,也看不出来问题,加了catch之后,发现总是时不时的蹦出一个 值不在范围内的错误,位置是 Request.InputStream 这里执行失败,
,百思不得其解,并不是一直都不到数据,也可以收到,比如说10条数据中可能有一条错误,100条中出现2~3条这中,而且不规律,随机出现的错误。首先想的是不是第三方发的数据有问题,于是进行抓包,结果并不是,每笔数据格式都是一样的,数据无误。这下问题就出现在代码上。会不会多线程时,会有丢失抓到的数据的情况呢,测试了一下,将 Task.Factory.StartNew ,移动到解析数据后,进行逻辑处理的那里,于是
- Task.Factory.StartNew(()=>{
- DealHelper deal = new DealHelper();
- deal.Buess(res);
- });
再进行测试时,果然,没有数据丢失的情况了,果然又是这个多线程捣的鬼。
线程那些坑 - HttpContext的更多相关文章
- python 强制结束线程的坑
网上流传了两种能强制结束线程的错误姿势 第一种:通过setDaemon来结束线程 http://www.cnblogs.com/jefferybest/archive/2011/10/09/22040 ...
- 线程内唯一对象HttpContext
在asp.net中,HttpContext是主线程内唯一对象.在web应用中开启多线程,在另外一个线程中是无法访问HttpContext. 如果需要在另外一个线程中使用HttpContext.Curr ...
- EF上下文对象线程内唯一性与优化
在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...
- EF 保证线程内唯一 上下文的创建
1.ef添加完这个对象,就会自动返回这个对象数据库的内容,比如下面这个表是自增ID 最后打印出来的ID 就是自增的结果 2.lambda 中怎么select * var userInfoList = ...
- asp.net mvc中在使用async的时候HttpContext为null的问题
摘要 HttpContext上下文并不是无处不在的.详情可以看下Fish Li的文章,解释的比较清楚. HttpContext.Current并非无处不在 问题复现 public async Task ...
- 我所知道的HttpContext.Current
在MVC中,HttpContext.Current是比较常见的对象,可以用它来进行Session,Cache等的保存等.但是它并不是无处不在的,下面就慢慢来揭开它的面纱. 当我们向服务端发送请求的时候 ...
- HttpContext.Current 的缺陷
了解ASP.NET的开发人员都知道它有个非常强大的对象 HttpContext,而且为了方便,ASP.NET还为它提供了一个静态属性HttpContext.Current来访问它,今天的博客打算就从H ...
- HttpContext.Current多线程调用
1.在web网站的Global中,进行数据量比较大的初始化工作,而为了使用户在页面上能够及时响应,我们在Global中开启了一个线程执行该函数模块. 不过,在线程中用到HttpContext.Curr ...
- HttpContext.Current并非无处不在
阅读目录 开始 无处不在的HttpContext HttpContext.Current到底保存在哪里? HttpContext并非无处不在! 如何获取文件绝对路径? 异步调用中如何访问HttpCon ...
随机推荐
- java自带日志框架打印info以下级别日志
本文为CSDN博主「LanTingShuXu」的原创文章,原文链接:https://blog.csdn.net/LanTingShuXu/article/details/80528558 java.u ...
- Blend 阴影 倒影 模糊效果
原文:Blend 阴影 倒影 模糊效果 1)阴影 和模糊效果很简单 在Blend的面板效果中就有体现 直接拖拽到控件即可 2)文本加圆角 需要一个布局控件Border 设置属性CornerRadius ...
- Regex 提取字符串中重复数据且格式化显示
方法:用 $下标 提取满足项的值 /** * 餐食信息格式转换 * @早餐,1@晚餐,2 => 早餐(1份):晚餐(2份) */ convertMealInfo = (mealInfo ...
- BAT: Windows批处理更改当前工作路径
最近项目上需要获取文件夹下所有文件信息,因为文件夹是在server上,所以想用批处理bat来获取该路径下所有文件信息,然后通过任务计划管理去每天自动运行bat去更新文件信息内容. 获取文件夹下所有文件 ...
- 浅聊几种主流Docker网络的实现原理
原文:https://mp.weixin.qq.com/s/Jdxct8qHrBUtkUq-hnxSRw 参考:https://blog.csdn.net/yarntime/article/detai ...
- 你的MES系统又失败了?正确的打开方式在这里
都知道MES实施艰难,真正成功的很少:有人戏称:10个MES,7个失败.1个不死不活.1个伪成功,最后一个仍需努力. 导致MES实施失败的原因有很多,所谓“成功的MES是一样的,失败的MES各有各的失 ...
- Quality Center安装步骤
测试管理工具 u 安装条件: Quality Center:QC9中文版 数据库:Oracle10 g 操作系统:Windows XP u 安装步骤: 1. 点击setup.exe,出现如下界面,点 ...
- Java操作ElasticSearch之创建客户端连接
Java操作ElasticSearch之创建客户端连接 3 发布时间:『 2017-09-11 17:02』 博客类别:elasticsearch 阅读(3157) Java操作ElasticSe ...
- linux 利器
ncat nc strace dmesg 很重要,好多错误从程序的角度无法得到答案
- Windows C盘扩容
工具:大白菜pe1.将F盘数据拷贝放其他盘,并格式化F盘.2.进入大白菜PE,使用DiskGenius工具,右键C盘图示->扩容->C盘,继续其他操作.(其中,需将F盘释放为未使用,然后将 ...