Предположим, я пишу собственный фильтр MVC, который выполняет некоторые асинхронные вызовы в переопределениях метода, например:
public class MyActionFilter : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext ctx)
{
var stuff = ConfigureAwaitHelper1().Result;
// do stuff
}
public override void OnActionExecuting(ActionExecutingContext ctx)
{
var stuff = ConfigureAwaitHelper2().Result;
// do stuff
}
private async Task<string> ConfigureAwaitHelper1()
{
var result = await client.GetAsStringAsync("blah.com").ConfigureAwait(false);
return result;
}
private async Task<string> ConfigureAwaitHelper2()
{
return await client.GetAsStringAsync("blah.com").ConfigureAwait(false);
}
}
Почему OnActionExecuting
блокируется, а OnActionExecuted
нет? Принципиальной разницы между ними не вижу. Акт возврата происходит только после завершения асинхронной задачи, что скорее похоже на помещение результата в локальную переменную «анонимного возврата» перед его возвратом, поэтому я не понимаю, почему первый должен зайти в тупик.
.ConfigureAwait(false)
фактически позволял вам выполнять.Result
без взаимоблокировки, каждое ожидание вниз по цепочке вызовов должно иметь установленное.ConfigureAwait(false)
. Если один из них этого не делает, и именно это ожидание вызвало продолжение, вы попадете в тупик. Вам нужно показать код дляclient.GetAsStringAsync
и каждого вызова async/await под ним, пока вы не найдете тот, в котором все еще есть данные контекста. - person Scott Chamberlain   schedule 19.07.2016ActionFilterAttribute
является синхронным, и я не могу контролироватьclient
. Я понимаю, что вы беспокоитесь о том, чтобы сделать это полностью, но давайте просто предположим, что этот образец завершен и что внутриclient.GetAsStringAsync()
больше нечего настраивать. - person gzak   schedule 19.07.2016OnActionExecuting
блокировка, а неOnActionExecuted
? - person Diego   schedule 19.07.2016client.GetAsStringAsync()
и просто вернула необработанные задачи напрямую. В ее случае она увидела поведение, описанное здесь. - person gzak   schedule 19.07.2016