Как остановить зависание асинхронных методов действия Visual Studio 11 Beta - PullRequest
2 голосов
/ 05 марта 2012

В Visual Studio 11 Developer Preview методы асинхронного действия работали правильно, без проблем. После установки Visual Studio 11 Beta те же самые методы асинхронных действий теперь приводят к зависанию страницы на неопределенное время.

public class HomeController : AsyncController {
    public async Task<ActionResult> Index() {
        return View();
    }
}

Измените действие обратно на синхронное, и оно работает без зависаний.

public class HomeController : Controller {
    public ActionResult Index() {
        return View();
    }
}

Это сообщение в блоге (http://blogs.msdn.com/b/pfxteam/archive/2012/03/03/10277166.aspx) наводит меня на мысль, что проблема связана с бета-версией, однако сайт создан для .NET Framework 4.5, а не 4.0, поэтому, предположительно, он должен работать.

"Это означает, что, хотя вы абсолютно можете использовать Visual Studio 11 Beta для создания приложений, использующих async / await с .NET 4.5, в настоящее время вы не можете использовать Visual Studio 11 Beta для создания приложений, использующих async / await против .NET. 4, Silverlight 5 и т. Д., Поскольку компиляторы в бета-версии Visual Studio 11 ожидают типы другой формы, чем в существующих DLL-библиотеках AsyncCtpLibrary *. "

Любые предложения о том, где искать исправление?

1 Ответ

3 голосов
/ 06 марта 2012

Стивен Труб из Microsoft продолжил работу и предложил обходной путь. Вы можете увидеть его пост здесь . В итоге:

существует известная ошибка в ASP.NET MVC в .NET 4.5 Beta, которая приводит в этом вопросе, когда асинхронный метод завершается синхронно. До доступно исправление, простой обходной путь - добавить «await Task.Yield ();» в качестве первой строки асинхронного метода, заставляя его завершить асинхронно. Для того, чтобы это работало правильно, вам также необходимо убедиться, вы используете новый SynchronizationContext, предоставленный ASP.NET в .NET 4.5, что означает, что у вас есть строка:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

В разделе appSettings вашего файла конфигурации.

...