Asp.net

AspNetSynchronizationContext

  • September 30, 2012

嘗試使用新的 C# 5 非同步模型令我驚訝的AspNetSynchronizationContext是一個內部類(以及AspNetSynchronizationContextBase基類)。因此無證。但是在您的 ASP.NET 程式碼中使用 async/await 功能時,了解它的作用是很重要的。我是否正確,它確實保證您的延續將與HttpContext.Current原始呼叫者相同?它保證延續將在與呼叫者相同的執行緒上執行?

如果後一個假設不正確並且我得到了原始執行緒,我可以確保在延續中獲得相同的執行緒上下文嗎?我的意思是與執行緒和執行緒本地儲存相關的主體/文化?這很重要,因為 ASP.NET 本地化依賴於執行緒的文化,而我的應用程序依賴於 .NET 角色安全模型(執行緒的主體)。

我是否正確它確實保證您的延續將獲得與原始呼叫者相同的 HttpContext.Current ?它不保證延續將在與呼叫者相同的執行緒上執行?

是的,HttpContext.Current被保留了,是的,延續可能在不同的執行緒上執行。

我的意思是與執行緒和執行緒本地儲存相關的主體/文化?這很重要,因為 ASP.NET 本地化依賴於執行緒的文化,而我的應用程序依賴於 .NET 角色安全模型(執行緒的主體)。

普通執行緒本地儲存失去。您可以通過使用LogicalCallContext(與 一起流動ExecutionContext)來緩解這種情況,但async直接引用變數會更容易。

本金始終保留;否則會帶來安全風險。這與ExecutionContext.

我相信文化會隨著.NET 4.5 的新實現AspNetSynchronizationContext而流動,但我還沒有對此進行測試。


您可能會發現我的MSDN 文章SynchronizationContext很有幫助。它不是官方文件(我不為微軟工作),但至少它是一些東西。請注意,該AspNetSynchronizationContext文章中引用的內容現在LegacyAspNetSynchronizationContext在 .NET 4.5 中呼叫。

另一個很好的資源是 Stephen Toub 的ExecutionContextvs.SynchronizationContext .

引用自:https://stackoverflow.com/questions/12659851