如何在 Task.Factory.StartNew 中访问 HttpContext.Current

本文关键字:访问 HttpContext Current StartNew Factory Task | 更新日期: 2023-09-27 18:34:35

我想在我的 asp.net 应用程序中访问 HttpContext.Current

Task.Factory.Start(() =>{
    //HttpContext.Current is null here
});

如何修复此错误?

如何在 Task.Factory.StartNew 中访问 HttpContext.Current

Task.Factory.Start将启动一个新Thread,并且由于HttpContext.Context是线程的本地,因此它不会自动复制到新Thread,因此您需要手动传递它:

var task = Task.Factory.StartNew(
    state =>
        {
            var context = (HttpContext) state;
            //use context
        },
    HttpContext.Current);

您可以使用闭包使其在新创建的线程上可用:

var currentContext = HttpContext.Current;
Task.Factory.Start(() => {
    // currentContext is not null here
});

但请记住,任务的寿命可能超过HTTP请求的生存期,并且在请求完成后访问HTTPContext时可能会导致有趣的结果。

正如David指出的那样,HttpContext.Current不会一直工作。就我而言,大约 20 次中的 1 次,CurrentContext 将为空。最后是下面。

string UserName = Context.User.Identity.Name;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
    UserName ...
}