2010-08-06 86 views
2

使用BeginMethod/EndMethod模式Using an Asynchronous Controller in ASP.NET MVC部分涉及Sync()方法。它沒有鏈接,我無法通過谷歌搜索查找文檔,因爲同步過於常見。有人能指出我的寫作方向嗎?ASP.NET異步控制器和調用Sync();什麼是「同步()」?

爲了確保您可以訪問 的HttpContext.Current實例並 避免競爭條件,您可以通過 從回調方法調用 同步()恢復HttpContext.Current。

回答

4

當您通過調用控制器操作中的BeginXyz/EndXyz方法產生異步操作時,處理異步響應的線程不在ASP.NET的控制之下。因此,您無法觸摸這些線程內的HttpContext,控制器實例或任何其他共享狀態。調用Sync()方法基本上同步對請求的訪問;它會恢復HttpContext.Current並授予您訪問觸摸HttpContext,控制器等的權限,但僅限於Sync()調用期間。 MVC Futures的RegisterTask()擴展方法試圖使這更簡單一些,因爲基本上它將委託傳遞給目標Begin和End方法,而RegisterTask()輔助方法將確保End線程在適當的同步上下文中執行。

如果您通過在控制器操作中調用XyzAsync/XyzCompleted方法來派生異步操作,則不必擔心這一點,因爲完成的處理程序會自動在同步上下文中運行。