2012-05-19 10 views

risposta

30

Task.Factory.Start si attiverà una nuova Thread e perché il HttpContext.Context è locale a un filo non sarà automaticly copiato nella nuova Thread, quindi è necessario passare a mano:

var task = Task.Factory.StartNew(
    state => 
     { 
      var context = (HttpContext) state; 
      //use context 
     }, 
    HttpContext.Current); 
+0

abbastanza interessante, che funziona strano per me. Ad esempio, la proprietà User di HttpContext diventa nulla dopo aver inserito il thread, sebbene abbia avuto un valore in HttpContext.Current. – Giedrius

+2

Sì, vale la pena notare che l'utilizzo di un riferimento a HttpContext.Current potrebbe funzionare molto tempo ma non è consigliato ed è probabile che non riesca a volte. Il runtime ASP può ripulire l'oggetto quando viene effettuata la richiesta http e quindi troverai cose come 'context.Items [x]' non contiene ciò che hai inserito prima. Vedi anche http://stackoverflow.com/questions/8925227/access-httpcontext-current-from-threads – Rory

8

Si potrebbe utilizzare una chiusura di averlo a disposizione sul thread appena creato:

var currentContext = HttpContext.Current; 

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

Ma tenere a mente che un compito può sopravvivere la durata della richiesta HTTP e potrebbe portare a risultati divertenti quando si accede al HTT PContext dopo che la richiesta è stata completata.

+0

Mi piace usare in questo modo invece di passare in uno stato oggetto e gettare gli elementi in singole variabili ... disordinato. –

0

Come indicato da David, HttpContext.Current non funzionerà sempre. Nel mio caso, circa 1 volta su 20, CurrentContext sarà nullo. Finisci con sotto.

string UserName = Context.User.Identity.Name; 

System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    UserName ... 
} 
Problemi correlati