线程那些坑 - 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);
});

再进行测试时,果然,没有数据丢失的情况了,果然又是这个多线程捣的鬼。

 

上一篇:if you wanna the rainbow, you have to deal with the rain.


下一篇:PAT (Advanced Level) Practice 1027 Colors in Mars (20 分)