我有一个自定义模型活页夹:
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().Result 似乎使我的网络请求超时。
模型绑定器接口强制同步 API...但是通过将此代码移动到我的控制器中:
public async Task<IHttpActionResult> DoStuff()
{
var json = await Request.Content.ReadAsStringAsync();
......
}
并使用await over .Result进行消费——网络请求顺利通过。我很好奇为什么?
如果在 Task 中使用 Result ,它会阻塞当前正在执行的线程,直到它返回结果。
如果您
await
调用,请求会异步运行而不会阻塞线程,并且您可以使用 await
运行多个请求(任务)函数,而不会阻塞线程。
所以使用await比使用result更好。