Подтвердить что ты не робот

Какие события жизненного цикла ASP.NET могут быть асинхронными?

Я написал собственный элемент управления ASP.NET, и я просто обновил его, чтобы обработчик события async Load. Теперь я получаю эту ошибку:

Асинхронная операция не может быть запущена в это время. Асинхронные операции могут запускаться только в асинхронном обработчике или модуле или во время определенных событий в жизненном цикле страницы. Если это исключение произошло во время выполнения страницы, убедитесь, что страница отмечена <% @Page Async = "true" % > .

На странице уже есть тег <%@ Page Async="true" %>. Поэтому я считаю, что элементы управления не могут иметь обработчики событий async load.

Где я могу найти исчерпывающий список событий в жизненном цикле веб-форм ASP.NET, которые могут быть асинхронными?

4b9b3361

Ответ 1

Дамиан Эдвардс из команды ASP.NET дал следующий ответ:

Обработчики событий async void в веб-формах поддерживаются только на определенных события, как вы нашли, но на самом деле предназначены только для упрощения задания. Мы рекомендуем использовать PageAsyncTask для любой асинхронной работы любого реального сложность.

Леви Бродерик из команды ASP.NET дал следующий ответ:

Асинхронные события в веб-приложениях по своей природе являются странными животными. асинхронный void предназначен для пожара и забывает модель программирования. Это работает в Приложения Windows UI, так как приложение OS убивает его, поэтому всякий раз, когда выполняется обратный вызов async, гарантируется быть потоком пользовательского интерфейса, с которым он может взаимодействовать. В веб-приложениях, эта модель разваливается, так как запросы по определению являются временными. Если асинхронный обратный вызов запускается после завершения запроса, нет никакой гарантии, что структуры данных, требующие обратного вызова, должны взаимодействовать, все еще находятся в хорошем состоянии. Поэтому зачем стрелять и забывать (и async void) по своей сути является плохой идеей в веб-приложениях.

Это сказал, мы делаем сумасшедшую гимнастику, чтобы попытаться сделать очень простые вещи, как Страница_Load работает, но код для поддержки этого чрезвычайно сложный и не проверены на что-либо помимо основных сценариев. Так что если вы нужна надежность Id stick с RegisterAsyncTask.

Итак, я думаю, что ответ на мой вопрос: "Это неправильный вопрос".

Правильный вопрос: "Как я должен быть async в моем приложении ASP.NET Web Forms?" И ответ заключается в том, чтобы вставить этот фрагмент внутри вашего файла с кодом в формате aspx:

this.RegisterAsyncTask(new PageAsyncTask(async cancellationToken => {
    var result = await SomeOperationAsync(cancellationToken);
    // do something with result.
}));

Этот же трюк работает внутри настраиваемых элементов управления ASP.NET, вместо этого используйте this.Page.RegisterAsyncTask.

Ответ 2

На этой странице объясняется, как обработка событий жизненного цикла на асинхронных страницах отличается от обработки синхронных страниц в ASP.NET 2.0 (особенно полезно рисунок 2):

Злой код: асинхронные страницы в ASP.NET 2.0

Вы также можете найти этот SO-вопрос использования (он говорит об одном и том же сообщении об ошибке):

ключевое слово async и выбор TaskScheduler