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

时间:2012-05-19 05:03:18

标签: c# asp.net .net c#-4.0 asp.net-4.0

我想在

中的asp.net应用程序中访问HttpContext.Current
Task.Factory.Start(() =>{
    //HttpContext.Current is null here
});

如何解决此错误?

3 个答案:

答案 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 ...
}