异步任务,HttpContext.Current为null解决办法

最近在开发一个后台管理系统项目,为了提高登录的速度,就把记录登录日志放到一个异步任务里面。

Action taskAction = () =>
{
    SaveLog();
};
Task task = new Task(taskAction);
task.Start();

有一段时间日志记录是正常的,突然有一天就不work了,本地调试也能重现这个错误,是System.Web.HttpContext.Current为null造成的,获取不了当前的用户名。

在网上搜了一下,确实很多用户遇到了,有推荐缓存System.Web.HttpContext.Current的,感觉挺麻烦的。

发现这个Current是可以set的,所以就想把当前线程里面的HttpContext.Current传到日志线程里面。

public static HttpContext Current { get; set; }

Action是个委托,委托是可以+=的,于是就封装了一下。

public class AsyncTaskHelper
{
    /// <summary>
    /// 异步任务之前,设置HttpContext.Current
    /// </summary>
    /// <param name="context"></param>
    /// <param name="action"></param>
    public static void StartTask(HttpContext context, Action action)
    {
        Action newAction = () =>
        {
            if (context == null)
            {
                throw new Exception("请确保HttpContext.Current不为null");
            }
            HttpContext.Current = context;
        };
        newAction += action;
        Task task = new Task(newAction);
        task.Start();
    }
}

调用也很简单

AsyncTaskHelper.StartTask(System.Web.HttpContext.Current, taskAction);

原文地址:https://www.cnblogs.com/lhking/p/10228285.html

时间: 2024-10-07 05:56:35

异步任务,HttpContext.Current为null解决办法的相关文章

解决Asp.net Mvc中使用异步的时候HttpContext.Current为null的方法

在项目中使用异步(async await)的时候发现一个现象,HttpContext.Current为null,导致一系列的问题. 上网查了一些资料后找到了一个对象: System.Threading.SynchronizationContext (提供在各种同步模型中传播同步上下文的基本功能.), 跟踪代码后发现 SynchronizationContext.Current 返回的是一个叫 System.Web.LegacyAspNetSynchronizationContext 的内部类对象

ASP.NET多线程下使用HttpContext.Current为null解决方案

多线程或者异步调用中如何访问HttpContext? 前面我还提到在APM模式下的异步完成回调时,访问HttpContext.Current也会返回null,那么此时该怎么办呢? 答案有二种:1. 在类型中添加一个字段来保存HttpContext的引用(异步开始前).2. 将HttpContext赋值给BeginXXX方法的最后一个参数(object state) 建议优先选择第二种方法,因为可以防止以后他人维护时数据成员被意外使用. 引用: 不错的文章:http://www.cnblogs.c

Hbase出现ERROR: Can&#39;t get master address from ZooKeeper; znode data == null解决办法

问题描述如下: hbase(main):001:0> list TABLE ERROR: Can't get master address from ZooKeeper; znode data == null Here is some help for this command: List all tables in hbase. Optional regular expression parameter could be used to filter the output. Examples:

http流请求时,被请求站点HttpContext.Current为null?

我负责运维一个短信接口站点sms.调用上游短信供应商下发短信后,他们会给我们推送发送报告.报告是类似DELIVRD.DI:9432这样的码.为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死在程序里的.这样的弊端是,后期每次添加了这个映射关系后,都要更新网站程序,增大了维护成本.为了降低维护成本,我做了改进方案.将这个映射关系保存到一个文本文件ReportCodeMapper.txt里,提供一个页面来允许修改这个文件的内容. 对于使用的逻辑,声明一个静态的Dictionary,初始化时

getActiveWorkbenchWindow() return null 解决办法

getActiveWorkbenchWindow 有如下声明 /** * Returns the currently active window for this workbench (if any). Returns * <code>null</code> if there is no active workbench window. Returns * <code>null</code> if called from a non-UI thread. *

SQLNestedException: Cannot create JDBC driver of class &#39;&#39; for connect URL &#39;null&#39; 解决办法

当跑jndi项目时抛出:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'异常 解决办法: 1.在Tomcat 6.0\lib下加入oracle驱动包ojdbc14_g-10.2.0.1.0.jar 2.在Tomcat 6.0\conf下的context.xml文件中加入 [javascript] view plaincopy <R

WCF 中HttpContext.Current为null的解决办法

解决WCF hosting IIS的环境中使HttpContext.Current不为NULL, 来我们传递每次请求中的Cookie 经过测试发现只要注意下面亮点就可以了: 1. 在hosting WCF的web.config中加入: <system.serviceModel>   <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/></system.serviceModel>

Android界面隐藏软键盘的探索(兼findViewById返回null解决办法)

最近写的APP,老师说我的登陆界面虽然有ScrollView滑动,但用户体验不太好,因为软键盘会挡住输入框或登录button(小米Pad,横屏,当指定只能输入数字时没找到关闭系统自带键盘的下箭头). 虽然我觉得ScrollView就够用了,能找到登录按钮…… 在默默吐槽了下连搜狗都有的功能小米没有后,上网上搜索了下解决办法. 首先,当activity加载完成后,屏蔽EditText自动弹出软键盘,需要一句话: 1 getWindow().setSoftInputMode(WindowManage

PHP 获取JSON json_decode返回NULL解决办法

在用json_decode对JSON格式的字符串进行解码时竟然为空,页面空白啊,整半天检查这里检查那里,问同事都没用. 今天必应搜索了下,问题解决了,原来是有BOM头输出,大虾的解决办法如下: 1).json_decode($json,boolean):$json为json格式的字符,第二个参数为TRUE时表示转换为数组,默认的FALSE表示 转换为对象. 2).json_decode要求的字符串比较严格: (1)使用UTF-8编码 (2)不能在最后元素有逗号 (3)不能使用单引号 (4)不能有