從Stephen Cleary的這個答案中,我了解到HttpContext與SynchronizationContext的流動。因此,考慮到下面這段代碼:
public async Task<。 ActionResult> Index()。
{
var outerContext = System.Web.HttpContext.Current = new HttpContext(
new HttpRequest(null, "http://test.com", null) 。
new HttpResponse(new StreamWriter("C:/Path") )。
Console.WriteLine(outerContext.Equals(System.Web.HttpContext.Current))。
await Task.Run(
delegate[/span
{
Console.WriteLine(outerContext.Equals(System.Web.HttpContext.Current))。
});
Console.WriteLine(outerContext.Equals(System.Web.HttpContext.Current))。
return View()。
}
我希望控制臺的輸出是:
。True
假的。
真
然而,實際輸出是:
True
假的。
False False
經過除錯,似乎延續中的背景關系被設定為請求的原始背景關系,即我通過呼叫HttpContext.Current = ...手動設定之前的那個。這到底是什么原因呢?它是否在await之后的代碼被執行之前被設定為請求背景關系?
uj5u.com熱心網友回復:
HttpContext.Current值是不被await保存和恢復。await將捕獲SynchronizationContext.Current并使用它來恢復執行。
當請求開始時,一個新的請求背景關系被創建(它包括一個特定的HttpContext.Current實體)。每當AspNetSynchronizationContext在該請求背景關系上恢復執行時,它將HttpContext.Current設定為該請求背景關系的實體。
因此,在await之后,HttpContext.Current將是它在Index開始時的同一個實體,而不是你的代碼分配給它的任何實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/322721.html
標籤:
