How do I access HttpContext.Current in Task.Factory.StartNew? How do I access HttpContext.Current in Task.Factory.StartNew? asp.net asp.net

How do I access HttpContext.Current in Task.Factory.StartNew?


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);


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.


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