问题
I want to access HttpContext.Current in my asp.net application within
Task.Factory.Start(() =>{
//HttpContext.Current is null here
});
How can I fix this error?
回答1:
Task.Factory.Start
will fire up a new Thread
and because the HttpContext.Context
is local to a thread it won't be automaticly copied to the new Thread
, so you need to pass it by hand:
var task = Task.Factory.StartNew(
state =>
{
var context = (HttpContext) state;
//use context
},
HttpContext.Current);
回答2:
You could use a closure to have it available on the newly created thread:
var currentContext = HttpContext.Current;
Task.Factory.Start(() => {
// currentContext is not null here
});
But keep in mind that a task can outlive the lifetime of the HTTP request and could lead to funny results when accessing the HTTPContext after the request has completed.
回答3:
As David pointed out, HttpContext.Current will not work all the time. In my case, about 1 of 20 time, CurrentContext will be null. End up with below.
string UserName = Context.User.Identity.Name;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
UserName ...
}
来源:https://stackoverflow.com/questions/10662456/how-do-i-access-httpcontext-current-in-task-factory-startnew