Я пытаюсь выяснить, следует ли использовать ConfigureAwait (false) для запросов верхнего уровня. Читая этот пост от нескольких авторитетов субъекта: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
... он рекомендует что-то вроде этого:
public async Task<JsonResult> MyControllerAction(...)
{
try
{
var report = await _adapter.GetReportAsync();
return Json(report, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
return Json("myerror", JsonRequestBehavior.AllowGet); // really slow without configure await
}
}
public async Task<TodaysActivityRawSummary> GetReportAsync()
{
var data = await GetData().ConfigureAwait(false);
return data
}
... он говорит об использовании ConfigureAwait (false) для каждого ожидания, кроме вызова верхнего уровня.. Однако при выполнении этого моего исключения требуется несколько секунд, чтобы вернуться к вызывающему и использовать его, и это и сразу же он вернулся.
Какова наилучшая практика для действий контроллера MVC, вызывающих методы async? Должен ли я использовать ConfigureAwait в самом контроллере или просто в вызовах службы, которые используются для запроса данных и т.д.? Если я не использую его при вызове верхнего уровня, ожидая несколько секунд для исключения, кажется проблематичным. Мне не нужен HttpContext, и я видел другие сообщения, которые всегда использовали ConfigureAwait (false), если вам не нужен контекст.
Update: Мне не хватало ConfigureAwait (false) где-то в моей цепочке вызовов, из-за чего исключение не возвращалось сразу же. Однако до сих пор остается открытым вопрос о том, следует ли использовать ConfigureAwait (false) на верхнем уровне.