Async PartialView викликає виняток "HttpServerUtility.Execute заблоковано ..."


85

У мене частковий вигляд, який намагається отримати a IEnumerable<Post>з бази даних за допомогою async ...

Метод

public static class PostService
{
    public static int PostsPerPage = 50;

    public static async Task<IEnumerable<Post>> GetRecentAsync(int page = 0)
    {
        return await entityFrameworkDbContext.Posts
            .ToListAsync();
    }
}

PartialView

public async Task<ActionResult> Recent(int page = 0)
{
    return PartialView(await PostService.GetRecentAsync(page));
}

І тоді, якщо я спробую це зателефонувати

@Html.Action("Recent", "Post")

Я отримую наступний виняток

HttpServerUtility.Execute заблоковано під час очікування завершення асинхронної операції.

Опис: Під час виконання поточного веб-запиту сталося необроблене виняток. Будь ласка, перегляньте трасування стека, щоб отримати додаткову інформацію про помилку та про те, звідки вона виникла в коді.

Подробиці винятку: System.InvalidOperationException: HttpServerUtility.Execute заблоковано під час очікування завершення асинхронної операції.

Чому я отримую цю помилку? Чи не має це працювати?

Відповіді:


97

Дії дитини повинні викликатися синхронно. Випуск 601 Мені також невідомо про останні оновлення поточних бібліотек MVC, що дозволяють цю функціональність.

Коментар до випуску 601, натякає на додавання цієї функціональності у MVC vNext, aka. MVC6. Діти дитини виглядають заміненими, на ViewComponentякі можна асинхронно викликати вигляд, як показано нижче. Повні приклади тут і тут

<div>
@await Component.InvokeAsync("YourComponent")
</div>

Більше про MVC6 можна дізнатись на веб-сайті http://www.asp.net/vnext/overview/aspnet-vnext/overview

Примітка: Ця відповідь - це лише формальність, тому запитання можна позначити як відповідь


посилання 601 вже не дійсне
Серж

6

Вирішення цієї проблеми полягає в тому, щоб зробити метод синхронним, як вимагає MVC, очистити SynchronizationContext, викликати метод async і почекати результату, а потім відновити контекст.

Побачте мого повного aswer тут


3
(Здається, ця публікація не дає якісної відповіді на запитання. Будь ласка, відредагуйте свою відповідь або просто опублікуйте її як коментар до питання).
sɐunıɔ ןɐ qɐp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.