我有一个自定义模型活页夹,需要访问数据库。我可以同步执行此操作,但我想异步执行。
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;
假设数据库调用花费很长时间(idk说三秒钟),那么这样做能从中受益吗?