• 线程那些坑


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

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

  • 相关阅读:
    eclipse 智能提示
    android 入门 004 (同一个方法,点击实现不同的效果)
    android 入门 003 (点击事件)
    android 入门 002 (拨打电话,发送短信)
    android 入门 001 (界面布局)
    Eclipse智能提示及快捷键
    转 Android学习笔记: 学习过程中碰到的一些问题及解决方法
    flash视频器播放器代码
    asp.net MVC webservice 报次错解决方法
    快递单号规则
  • 原文地址:https://www.cnblogs.com/Sientuo/p/10454170.html
Copyright © 2020-2023  润新知