线程那些坑 - 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的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程总结:二Thread的那些坑和填坑的线程池

Netty中的那些坑

那些年,我们一起踩过的 “Android 坑”

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)