Ich habe ein folgendes Codebeispiel, das in ASP.NET MVC-Anwendung verwendet wird. Der Zweck dieses Codes besteht darin, eine "fire and forget" -Anforderung zum Einreihen in eine lange laufende Operation zu erstellen.ASP.NET HttpContext.Current in Task.Run
public JsonResult SomeAction() {
HttpContext ctx = HttpContext.Current;
Task.Run(() => {
HttpContext.Current = ctx;
//Other long running code here.
});
return Json("{ 'status': 'Work Queued' }");
}
Ich weiß, dass dies für den Umgang mit HttpContext.Current in asynchronem Code kein guter Weg ist, aber zur Zeit unsere Implementierung erlaubt uns nicht, etwas anderes zu tun. Ich mag würde zu verstehen, wie viel dieser Code ist gefährlich ...
Die Frage: Ist es theoretisch möglich, dass Einstellung der Httpcontext innerhalb Task.Run, den Kontext auf völlig andere Anforderung?
Ich denke ja, aber ich bin mir nicht sicher. Wie ich es verstehe: Request1 wird mit Thread1 aus Thread-Pool behandelt, während Thread1 absolut eine andere Anfrage (Request2) behandelt, wird der Code innerhalb von Task.Run Kontext von Request1 zu Request2 setzen.
Vielleicht irre ich mich, aber mein Wissen über ASP.NET Interna erlaubt mir nicht, es richtig zu verstehen.
Danke!
Wäre es nicht einfacher, nur die Informationen aus dem HttpContext zu holen, die Sie benötigen, anstatt den gesamten HttpContext zu übergeben? (Ich weiß, das beantwortet deine Frage nicht, aber ich bin neugierig auf die Notwendigkeit des ganzen Zusammenhangs). – vcsjones
Richtig, das ist viel richtiger Weg, aber leider kann ich das momentan nicht ändern. Unser Code hat Zugriff auf HttpContext.Current tief in Business-Logik und ändern es ist ein großer Aufwand, den wir derzeit nicht haben. –
Nicht im Zusammenhang mit Ihrer Frage - lange laufende Aufgabe im Web-Kontext ist keine gute Idee - der Server kann neu gestartet werden und es gibt nur so viele Threads im Pool - sobald Sie keine Threads mehr haben, werden Sie aufhören, Anfragen zu bedienen. Hast du etwas wie HangFire oder Quartz in Betracht gezogen? –