У меня есть пользовательский механизм связывания моделей, которому требуется доступ к базе данных. Я могу сделать это синхронно, но я бы хотел сделать это асинхронно.
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;
Если предположить, что вызов базы данных занимает много времени (скажем, три секунды), получаю ли я какую-либо выгоду от этого?