Ответ 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
.