如何访问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 ... }