【发布时间】:2016-01-16 02:51:01
【问题描述】:
我返回一个列表,它基本上调用了两个异步操作:
[HttpPost]
public ActionResult List(DataSourceRequest command, ProductListModel model)
{
var categories = _productService.GetAllProducts(model.SearchProductName,
command.Page - 1, command.PageSize);
var gridModel = new DataSourceResult
{
Data = categories.Select(async x =>
{
var productModel = x.ToModel();
var manufacturer = await _manufacturerService.GetManufacturerById(x.ManufacturerId);
var category = await _categoryService.GetCategoryById(x.CategoryId);
productModel.Category = category.Name;
productModel.Manufacturer = manufacturer.Name;
return productModel;
}),
Total = categories.TotalCount
};
return Json(gridModel);
}
这是一个 ajax 请求(来自客户端),但在前端它永远不会返回。有没有死锁?
【问题讨论】:
-
awaiting 不在一个 (a) 未标记为async且 (b) 未返回Task<ActionResult>的方法内时,您的调用情况如何? -
因为它是一个 lamda 表达式。如果我将方法标记为
async Task<ActionResult>,编译器会报告我的方法缺少await运算符。就算ii放了也没用。 -
酷,我刚刚看到了
async代表。从外观上看,这就是问题所在。Data是Task<T>,其中T是x.ToModel()类型吗? -
不,Data = IEnumberable 而 ToModel() 是 ViewModel,即 ProductModel()
-
很确定它将是一个
IEnumerable<Task>,因为异步委托传递给.Select()。这意味着它不会等待任务完成。如果你awaitcategories.Select()通过包装在Task.WhenAll()中调用,将操作标记为async并返回Task<ActionResult>,我相信这应该可以解决你的问题
标签: c# asp.net .net asp.net-mvc async-await