如何访问Task.Factory.StartNew中的HttpContext.Current?

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

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

我该如何解决这个错误?

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时可能会导致有趣的结果。

正如大卫指出的那样,HttpContext.Current不会一直有效。 在我的情况下,大约20次中有1次,CurrentContext将为null。 以下结束。

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