线程那些坑 - 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 = ;
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的更多相关文章
- python 强制结束线程的坑
网上流传了两种能强制结束线程的错误姿势 第一种:通过setDaemon来结束线程 http://www.cnblogs.com/jefferybest/archive/2011/10/09/22040 ...
- 线程内唯一对象HttpContext
在asp.net中,HttpContext是主线程内唯一对象.在web应用中开启多线程,在另外一个线程中是无法访问HttpContext. 如果需要在另外一个线程中使用HttpContext.Curr ...
- EF上下文对象线程内唯一性与优化
在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...
- EF 保证线程内唯一 上下文的创建
1.ef添加完这个对象,就会自动返回这个对象数据库的内容,比如下面这个表是自增ID 最后打印出来的ID 就是自增的结果 2.lambda 中怎么select * var userInfoList = ...
- asp.net mvc中在使用async的时候HttpContext为null的问题
摘要 HttpContext上下文并不是无处不在的.详情可以看下Fish Li的文章,解释的比较清楚. HttpContext.Current并非无处不在 问题复现 public async Task ...
- 我所知道的HttpContext.Current
在MVC中,HttpContext.Current是比较常见的对象,可以用它来进行Session,Cache等的保存等.但是它并不是无处不在的,下面就慢慢来揭开它的面纱. 当我们向服务端发送请求的时候 ...
- HttpContext.Current 的缺陷
了解ASP.NET的开发人员都知道它有个非常强大的对象 HttpContext,而且为了方便,ASP.NET还为它提供了一个静态属性HttpContext.Current来访问它,今天的博客打算就从H ...
- HttpContext.Current多线程调用
1.在web网站的Global中,进行数据量比较大的初始化工作,而为了使用户在页面上能够及时响应,我们在Global中开启了一个线程执行该函数模块. 不过,在线程中用到HttpContext.Curr ...
- HttpContext.Current并非无处不在
阅读目录 开始 无处不在的HttpContext HttpContext.Current到底保存在哪里? HttpContext并非无处不在! 如何获取文件绝对路径? 异步调用中如何访问HttpCon ...
随机推荐
- SpringBoot 通过jjwt快速实现token授权
A 10分钟了解JSON Web令牌(JWT)https://baijiahao.baidu.com/s?id=1608021814182894637&wfr=spider&for=p ...
- Entity Framework 学习系列(4) - EF 增删改
目录 写在前面 一.开发环境 二.创建项目 三.新增 1.单表新增 2.批量新增 3.多表新增 四.编辑 1.先查询,后编辑 2.创建实体,后编辑 五.删除 写在前面 在上一小节中,学习了如何 通过C ...
- 脱离Office约束,C#结合Mpxj组件完美解析MSProject(.mpp)文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 2019 医渡云java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.医渡云等公司offer,岗位是Java后端开发,因为发展原因最终选择去了医渡云,入职一年时间了,也成为了面试官 ...
- Python的变量命名规则
1.只能用大小写字母与“_”(下划线) 2.数字不能用在开头,如:12tea 3.不能使用空格 4.C语言的变量命名规则如上相同
- django-orm 快速清理migrations缓存
Shell #!/bin/bash Project_dir=`pwd` find $Project_dir -type d -a -name 'migrations' \ -exec rm -rf { ...
- 十六、python面向对象基础篇
面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...
- 判断cms-暴库-后台查找-密码破解
1.判断网站CMS类型 判断目标 使用工具: 脚本语言 wvs 御剑 domain明小子 操作系统 wwwscan 啊d pangolin(穿山甲) 搭建平台 站长工具 netpark ...
- ZABBIX监控TCP连接状态
一.获取监控数据 # /bin/netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' LISTEN ESTABLISHED T ...
- nfs—文件转换器
前端时间,在做一次设备升级时对nfs有了新的认识. nfs一般认为是文件共享服务器,但在实际的工作环境中,业务服务器有诸多限制,需要有加密隔离措施等等,版本升级和功能调试不同于平时的实验环境. 特别好 ...