我想在
中的asp.net应用程序中访问HttpContext.CurrentTask.Factory.Start(() =>{
//HttpContext.Current is null here
});
如何解决此错误?
答案 0 :(得分:33)
Task.Factory.Start
会启动一个新的Thread
,因为HttpContext.Context
是一个线程的本地,它不会自动复制到新的Thread
,所以你需要手动传递:
var task = Task.Factory.StartNew(
state =>
{
var context = (HttpContext) state;
//use context
},
HttpContext.Current);
答案 1 :(得分:8)
您可以使用闭包在新创建的线程上使用它:
var currentContext = HttpContext.Current;
Task.Factory.Start(() => {
// currentContext is not null here
});
但请记住,任务可以比HTTP请求的生命周期更长,并且在请求完成后访问HTTPContext时可能会导致有趣的结果。
答案 2 :(得分:0)
正如David所指出的,HttpContext.Current不会一直有效。在我的情况下,大约20次中有1次,CurrentContext将为null。以下结束。
string UserName = Context.User.Identity.Name;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
UserName ...
}