Где-то в цепочке вызовов вы, вероятно, вызываете .Wait()
или .Result
для задачи. Это вызывает взаимоблокировку, потому что ваш планировщик не будет выпускать этот асинхронный контекст до тех пор, пока эта задача не будет завершена, но задача не может быть завершена без доступа к асинхронному контексту для обработки продолжения вашей задачи.
Лучшая рекомендация, как правило, заключается в том, чтобы идти «асинхронно до конца», используя async/await
паттерны на всем пути от действия вашего контроллера до этого метода.
Если это невозможно, следующая лучшая вещь - убедиться, что вы звоните .ConfigureAwait(false)
каждый раз, когда видите ключевое слово await
. Но будьте осторожны, потому что, если вы сделаете это, а затем попытаетесь получить доступ к чему-то вроде HttpContext.Current
после одного из этих событий, он потерпит неудачу.