线程那些坑 - HttpContext
Posted sientuo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程那些坑 - 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 = 0; int count = 0; byte[] buffer = new byte[1024]; StringBuilder builder = new StringBuilder(); while ((count = s.Read(buffer, 0, 1024)) > 0) builder.Append(Encoding.UTF8.GetString(buffer, 0, count)); s.Flush(); s.Close(); s.Dispose(); var res = builder.ToString(); if (res.Length > 10) 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的主要内容,如果未能解决你的问题,请参考以下文章
[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)
[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)
[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)