2012-05-19 9 views

Antwort

30

Task.Factory.Start wird ein neues Thread Feuer und weil die HttpContext.Context lokal zu einem Thread wird es nicht automatisch auf die neue Thread kopiert werden, so dass Sie es von Hand weitergeben müssen:

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

interessanterweise, das funktioniert seltsam für mich. Zum Beispiel wird die Benutzereigenschaft von HttpContext nach dem Eingeben des Threads zu null, obwohl sie in HttpContext.Current einen Wert hatte. – Giedrius

+2

Ja, es ist erwähnenswert, dass die Verwendung eines Verweises auf HttpContext.Current sehr oft funktioniert, aber es wird nicht empfohlen und es wird wahrscheinlich manchmal scheitern. ASP-Laufzeit kann das Objekt bereinigen, wenn die HTTP-Anfrage abgeschlossen ist und dann finden Sie Dinge wie 'context.Items [x]' enthält nicht, was Sie dort früher setzen. Siehe auch http://stackoverflow.com/questions/8925227/access-httpcontext-current-from-threads – Rory

8

Sie könnten verwenden, um eine Schließung auf den neu erstellten Thread zur Verfügung zu haben:

var currentContext = HttpContext.Current; 

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

Aber bedenken sie, dass eine Aufgabe, die Lebensdauer der HTTP-Anforderung überdauern können und zu lustigen Ergebnissen führen könnte, wenn die HTT Zugriff PContext, nachdem die Anfrage abgeschlossen wurde.

+0

ich so gerne anstelle in einem Zustand Objekt über und die Einzelteile in einzelne Variablen Gießen ... chaotisch. –

0

Wie David wies darauf hin, HttpContext.Current wird nicht die ganze Zeit arbeiten. In meinem Fall, etwa 1 von 20 Mal, wird CurrentContext null sein. Am Ende mit unten.

string UserName = Context.User.Identity.Name; 

System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    UserName ... 
} 
Verwandte Themen