之前记录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 = ;
int count = ;
byte[] buffer = new byte[];
StringBuilder builder = new StringBuilder();
while ((count = s.Read(buffer, , )) > )
{
builder.Append(Encoding.UTF8.GetString(buffer, , count));
}
s.Flush();
s.Close();
s.Dispose();
var res = builder.ToString();
if (res.Length > )
{
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的更多相关文章

  1. python 强制结束线程的坑

    网上流传了两种能强制结束线程的错误姿势 第一种:通过setDaemon来结束线程 http://www.cnblogs.com/jefferybest/archive/2011/10/09/22040 ...

  2. 线程内唯一对象HttpContext

    在asp.net中,HttpContext是主线程内唯一对象.在web应用中开启多线程,在另外一个线程中是无法访问HttpContext. 如果需要在另外一个线程中使用HttpContext.Curr ...

  3. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  4. EF 保证线程内唯一 上下文的创建

    1.ef添加完这个对象,就会自动返回这个对象数据库的内容,比如下面这个表是自增ID 最后打印出来的ID  就是自增的结果 2.lambda 中怎么select * var userInfoList = ...

  5. asp.net mvc中在使用async的时候HttpContext为null的问题

    摘要 HttpContext上下文并不是无处不在的.详情可以看下Fish Li的文章,解释的比较清楚. HttpContext.Current并非无处不在 问题复现 public async Task ...

  6. 我所知道的HttpContext.Current

    在MVC中,HttpContext.Current是比较常见的对象,可以用它来进行Session,Cache等的保存等.但是它并不是无处不在的,下面就慢慢来揭开它的面纱. 当我们向服务端发送请求的时候 ...

  7. HttpContext.Current 的缺陷

    了解ASP.NET的开发人员都知道它有个非常强大的对象 HttpContext,而且为了方便,ASP.NET还为它提供了一个静态属性HttpContext.Current来访问它,今天的博客打算就从H ...

  8. HttpContext.Current多线程调用

    1.在web网站的Global中,进行数据量比较大的初始化工作,而为了使用户在页面上能够及时响应,我们在Global中开启了一个线程执行该函数模块. 不过,在线程中用到HttpContext.Curr ...

  9. HttpContext.Current并非无处不在

    阅读目录 开始 无处不在的HttpContext HttpContext.Current到底保存在哪里? HttpContext并非无处不在! 如何获取文件绝对路径? 异步调用中如何访问HttpCon ...

随机推荐

  1. DOM事件机制解惑(摘)--事件的传播机制

    DOM事件流 为什么是有事件流? 假如在一个button上注册了一个click事件,又在其它父元素div上注册了一个click事件,那么当我们点击button,是先触发父元素上的事件,还是button ...

  2. LinQ in 写法

    有时候会碰到一个需求,又一堆id 1,2,3,4,循环遍历id再去数据库查不仅效率低,而且代码难看,可以用in来实现: string[] codes = item.ExamPaperCode.Spli ...

  3. Dozer JAVA的POJO 映射工具

    Dozerhttp://www.manongjc.com/article/50949.html JAVA的映射工具 BeanUtils dozer的使用方法https://blog.csdn.net/ ...

  4. python排序 基数排序

    算法思想 基数排序通过按位比较(一般从最低位开始)将元素按照最低位的数放到10个桶中,当所有的元素都这样被处理一次后,在按从0到9的顺序将每个桶的元素再取出来(不关注其他位的,只关注当前位的)这样就完 ...

  5. python——CSV转Excel

    在转换之前,事先需要将csv文件另存为此格式 import pandas as pd def csv_to_xlsx_pd(): csv = pd.read_csv(r'C:\Users\Jery\D ...

  6. ElasticSearch之安装及基本操作API

    ElasticSearch 是目前非常流行的搜索引擎,对海量数据搜索是非常友好,并且在高并发场景下,也能发挥出稳定,快速特点.也是大数据和索搜服务的开发人员所极力追捧的中间件.虽然 ElasticSe ...

  7. Matlab混入模式(Mixin)

    Mixin是一种类,这种类包含了其他类要使用的特性方法,但不必充当其他类的父类.Matlab无疑是支持多继承的.我们可以利用 Matlab 的这种特性,实现一种叫做 Mixin 的类.MixIn的目的 ...

  8. TinyMCE基础配置

    选择器配置 插件配置 工具栏配置 菜单配置 皮肤配置 编辑区宽高配置 编辑区样式配置 隐藏状态栏 选择器配置 选择器就是CSS选择器,它告诉TinyMCE哪个元素是可编辑的. 示例: tinymce. ...

  9. 实验吧——认真一点(绕过空格,逗号,关键字过滤等 sql盲注)

    题目地址:http://ctf5.shiyanbar.com/web/earnest/index.php 过滤和拦截了某些东西,我经过多次尝试,最终构造的是 1'=(ascii(mid((select ...

  10. bat 获取管理员权限,判断系统位数,获取当前文件所在目录,regsvr32注册DLL、OCX

    1.获取管理员权限 @echo off if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%Syste ...