zoukankan      html  css  js  c++  java
  • 异步任务,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);
  • 相关阅读:
    php javascript
    在线支付接口之PHP支付宝接口开发
    作业9 最长公共子序列
    第十二章 税制的设计
    第十一章 公共物品和公共资源
    第十章 外部性
    第九章 应用:国际贸易
    作业8 矩阵乘法链
    第八章 应用:赋税的代价
    第七章 消费者、生产者与市场效率
  • 原文地址:https://www.cnblogs.com/lhking/p/10228285.html
Copyright © 2011-2022 走看看