【问题标题】:Cannot Access HttpContext.Current when using Thread使用线程时无法访问 HttpContext.Current
【发布时间】:2020-03-21 13:52:15
【问题描述】:
Thread sendEmails = new Thread(() => AnnounceAllEmployee(Requisition_num));
sendEmails.Start();

当我访问在我的代码中使用:var httpContext = HttpContext.Current; 的方法时,出现错误 HttpContext.Current 为 null 我尝试在线程内访问它,但仍然收到错误,它为 null。

【问题讨论】:

    标签: c# asp.net-mvc multithreading asp.net-mvc-4


    【解决方案1】:

    HttpContext.Current 仅可用于主线程,从控制器生成的新线程将具有不同的上下文。

    您可以做的是将它作为参数传递。

    您需要修改 AnnounceAllEmployee 以处理新的 HttpContext 参数; AnnounceAllEmployee(... , HttpContext hc)

       HttpContext httpContext = HttpContext.Current;
       Thread sendEmails = new Thread(() => AnnounceAllEmployee(Requisition_num, httpContext));
    

    这不会克隆 http 上下文,而是仅通过引用传递它,因此不会消耗更多内存。

    编辑:似乎一旦请求完成,由于它是通过引用传递的,我们试图访问的主线程的 httpcontext 将在某些属性上返回 null。

    【讨论】:

    • 亲爱的,一旦它访问 AnnounceAllEmployee 方法,即使我使用参数传递它,它也会变为 NULL。
    • @QaisAlmomany 我更新了答案,看来我们需要进行复制。需要 HttpContext 的哪些具体属性?
    • 当前属性。
    • 当前属性是 HttpContext 类型。那么你在 Current 里面需要什么?
    • 我需要 HTTP 上下文来将部分视图呈现为字符串。
    【解决方案2】:

    需要牢记在心

    如果您尝试从另一个线程获取 HttpContext.Current,它将无法访问,并且当从一个线程传递到另一个线程时,HttpContext.Current 将始终为 null

    所以代替Thread,您需要使用Task 来获取HttpContext.Current

    如下:

    public async Task GetCurrentContextAsync()
    {
      //Current Context will be available in Task
      var httpContext = HttpContext.Current;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多