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

3

21

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?

Anna answered 19/5, 2012 at 5:3 Comment(0)
C
36

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);
Cupbearer answered 19/5, 2012 at 5:9 Comment(2)
interestingly enough, that does work strange for me. For example User property of HttpContext becomes null after entering the thread, although it had value in HttpContext.Current.Coelacanth
Yes, it's worth noting that using a reference to HttpContext.Current might work a lot of the time but it's not recommended and it's likely to fail at times. ASP runtime may clean up the object when the http request is done and then you'll find things like context.Items[x] doesn't contain what you put there earlier. See also #8925727Carding
F
8

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.

Follansbee answered 19/5, 2012 at 9:5 Comment(2)
I like using this way instead of passing in a state object and casting the items out into individual variables... messy.Laudian
By funny results, do you just mean old data inside the task's scope?Spoonbill
C
0

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 ...
}
Cane answered 28/9, 2016 at 14:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.