异步任务,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);
如果本文的描述的方法或内容有问题,请给我留言。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述