21

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

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

我该如何解决这个错误?

4

3 回答 3

36

Task.Factory.Start将启动一个新的Thread,因为它HttpContext.Context是线程的本地,它不会自动复制到新的Thread,所以你需要手动传递它:

var task = Task.Factory.StartNew(
    state =>
        {
            var context = (HttpContext) state;
            //use context
        },
    HttpContext.Current);
于 2012-05-19T05:09:20.140 回答
8

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

var currentContext = HttpContext.Current;

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

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

于 2012-05-19T09:05:40.033 回答
0

正如大卫指出的那样, HttpContext.Current 不会一直有效。就我而言,大约 20 次中有 1 次 CurrentContext 将为空。以下面结束。

string UserName = Context.User.Identity.Name;

System.Threading.Tasks.Task.Factory.StartNew(() =>
{
    UserName ...
}
于 2016-09-28T14:00:47.593 回答