zoukankan      html  css  js  c++  java
  • 线程那些坑

      之前记录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);
    });

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

  • 相关阅读:
    2016/10/18 数据库设计三大范式
    2016/10/13 Oracle COALESCE()
    2016/10/13 oracle中的round()
    2016/10/10 数据、数据元素和数据项
    2016/09/29 Maven简介
    2016/09/29 瀑布模型开发和敏捷开发
    python2和python3中的类
    使用JQuery完成页面定时弹出广告
    JQuery入门+js库文件分享
    使用JavaScript完成控制下拉列表左右选择
  • 原文地址:https://www.cnblogs.com/Sientuo/p/10454170.html
Copyright © 2011-2022 走看看