Можно ли сделать привязку пользовательской модели асинхронной? - PullRequest
1 голос
/ 22 апреля 2019

У меня есть пользовательский механизм связывания моделей, которому требуется доступ к базе данных. Я могу сделать это синхронно, но я бы хотел сделать это асинхронно.

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
    var json = actionContext.Request.Content.ReadAsStringAsync().Result; // nothing to see here
    Truck truck = JsonConvert.DeserializeObject<Truck>(json);
    truck.Availability = await _truckRepo.GetAvailability(truck.Id); // <-- problem. BindModel is a synchronous method
}

Конечно, есть и другие способы увлажнения этого объекта. Я мог бы просто установить его на первой строке в контроллере. Но мне всегда нужно будет получать Availability, поэтому было бы неплохо, если бы он был уже увлажнен, когда прибыл к контроллеру. Я мог бы заставить это работать синхронно, выполнив truck.Availability = _truckRepo.GetAvailability(truck.Id).Result, но тогда это было бы ... синхронно. Есть ли способ сделать это и по-прежнему быть асинхронным? Что, если я заверну все это в задании, выполню ожидания внутри задания и затем заставлю задание быть синхронным? Как это:

var success = Task.Run(async () =>
{
    var json = await actionContext.Request.Content.ReadAsStringAsync();
    Truck truck = JsonConvert.DeserializeObject<Truck>(json);
    truck.Availability = await _truckRepo.GetAvailability(truck.Id);
    return true;
}).Result;

Если предположить, что вызов базы данных занимает много времени (скажем, три секунды), получаю ли я какую-либо выгоду от этого?

...