我有一個在ASP.NET MVC應用程序中使用的以下代碼示例。 這段代碼的目的是爲排隊一些長時間運行的操作創建「發送和忘記」請求。ASP.NET HttpContext.Current在Task.Run中
public JsonResult SomeAction() {
HttpContext ctx = HttpContext.Current;
Task.Run(() => {
HttpContext.Current = ctx;
//Other long running code here.
});
return Json("{ 'status': 'Work Queued' }");
}
我知道這是不是在異步代碼處理HttpContext.Current一個很好的方式,但目前我們的實現不會讓我們到別的做一些事情。 我想明白這個代碼是多少危險......
問題:是理論上可能設置的HttpContext內Task.Run,將上下文設置爲完全另一個請求?
我想是的,但我不確定。我的理解如下: Request1由線程池中的Thread1處理,然後當Thread1處理絕對另一個請求(Request2)時,Task.Run中的代碼將設置上下文從Request1到Request2。
也許我錯了,但是我對ASP.NET內部知識的瞭解並不能讓我正確理解它。
謝謝!
從HttpContext獲取所需的信息,而不是傳入整個HttpContext會不會更簡單? (我意識到這並不能回答你的問題,但我對整個上下文的需求感到好奇)。 – vcsjones
對,這是非常正確的方式,但不幸的是,目前我無法改變它。我們的代碼可以訪問HttpContext.Current內部的業務邏輯,並且改變它是目前我們沒有的巨大努力。 –
與您的問題無關 - 在web上下文中執行長時間運行的任務並不是一個好主意 - 服務器可以重新啓動並且池中只有很多線程 - 一旦線程用完,您將停止提供請求。你有沒有考慮過像HangFire或Quartz? –