ожидайте vs. результат с HttpContent.ReadAsStringAsync - PullRequest
0 голосов
/ 10 мая 2019

У меня есть пользовательская модель переплета:

public class JsonPolyModelBinder : IModelBinder
{
    private readonly JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };

    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        var content = actionContext.Request.Content;
        var json = content.ReadAsStringAsync().Result;
        var obj = JsonConvert.DeserializeObject(json, bindingContext.ModelType, settings);
        bindingContext.Model = obj;
        return true;
    }
}

При большой полезной нагрузке content.ReadAsStringAsync (). Результат, по-видимому, приводит к превышению времени ожидания моих веб-запросов.

Интерфейс привязки модели вызывает синхронные API-интерфейсы ... но, переместив этот код в мой контроллер:

public async Task<IHttpActionResult> DoStuff()
{
    var json = await Request.Content.ReadAsStringAsync();
     ......
}

И использование await over .Result - веб-запросы проходят без проблем. Мне интересно, почему?

1 Ответ

0 голосов
/ 13 мая 2019

если вы используете Result in Task, он заблокирует текущий исполняющий поток до тех пор, пока не вернет результат. Если вы ожидаете вызова, запрос выполняется асинхронно, не блокируя поток, и вы можете запускать несколько функций запроса (Tasks), используя await, не блокируянить.так что лучше использовать ожидание, чем результат.

...