ASP.NET асинхронные контроллеры и вызов Sync ();что такое "Sync ()"? - PullRequest
2 голосов
/ 06 августа 2010

Работа с шаблоном BeginMethod / EndMethod раздел Использование асинхронного контроллера в ASP.NET MVC относится к методу Sync(). Он не связан, и у меня возникают проблемы с поиском документации по нему с помощью поиска в Google, поскольку синхронизация - это слишком распространенный термин. Может кто-нибудь указать мне направление записи?

Чтобы убедиться, что у вас есть доступ к экземпляр HttpContext.Current и чтобы избежать состояния гонки, вы можете восстановить HttpContext.Current, вызвав Sync () из метода обратного вызова.

Ответы [ 2 ]

4 голосов
/ 06 августа 2010

Когда вы порождаете асинхронные операции, вызывая методы BeginXyz / EndXyz из действия вашего контроллера, потоки, обрабатывающие асинхронный ответ, не находятся под контролем ASP.NET.Таким образом, вы не можете коснуться HttpContext, экземпляра контроллера или любого другого общего состояния из этих потоков.Вызов метода Sync () в основном синхронизирует доступ к запросу;он восстанавливает HttpContext.Current и предоставляет вам доступ к касанию HttpContext, контроллера и т. д., но только на время вызова Sync ().Метод расширения RegisterTask () из MVC Futures пытается сделать это немного проще, поскольку вы в основном передаете его делегаты целевым методам Begin и End, а помощник RegisterTask () гарантирует, что поток End будет выполняться в соответствующем контексте синхронизации.

Если вы порождаете асинхронные операции, вызывая методы XyzAsync / XyzCompleted из действия вашего контроллера, вам не нужно об этом беспокоиться, поскольку завершенный обработчик автоматически запускается в контексте синхронизации.

3 голосов
/ 06 августа 2010
...