При использовании Asynchronous OnActionExecuting: асинхронный модуль или обработчик завершены, пока асинхронная операция еще не завершена - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть контроллер, у которого OnActionExecuting переопределен как асинхронный c метод, таким образом:

protected override async void OnActionExecuting(ActionExecutingContext filterContext)
{
}

Внутри этого метода я вызываю некоторые ожидаемые методы, такие как await db.Empresa.FindAsync(EmpresaID); и await UserManager.FindByIdAsync(User.Identity.GetUserId());

При этом я получаю сообщение об ошибке: ASP.NET Controller: An asynchronous module or handler completed while an asynchronous operation was still pending.

Можно ли сделать метод OnActionExecuting asyn c? Есть ли способ решить эту проблему?

Хайме

1 Ответ

1 голос
/ 07 апреля 2020

Нет, он возвращает void не Task или другой ожидаемый тип, поэтому вызывающий код не сможет определить, когда асинхронная работа завершена.

Если необходимо использовать асинхронный метод в пределах OnActionExecuting (и это не так, как если бы вы это делали, потому что Entity Framework имеет синхронные эквиваленты), доступны только неоптимальные обходные пути.

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

Один из вариантов - запустить асинхронный код в пуле потоков:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var task = Task.Run(async () => db.Empresa.FindAsync(EmpresaID));
    var result = task.Result;
}

Это на самом деле было бы менее эффективно, чем простое использование db.Empresa.Find(EmpresaID), так как есть издержки, связанные с Task.Run.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...