我试图创建一个服务来从数据库中获取所有我的框:
[HttpGet]
[Route("GetBoxes/")]
[ResponseType(typeof(ResultQuery))]
public async Task<IHttpActionResult> GetBoxes()
{
try
{
var boxes = db.Boxes.ToList<Box>();
foreach (Box in boxes)
{
status.Add(GetBox(box));
}
return Ok(ConvertToResultQuery(boxes));
}
catch (Exception e)
{
return InternalServerError(e);
}
}
public GenericBox GetBox(Box box)
{
try
{
//Do a lot of stuff with the database
return genericBox;
}
catch (Exception e)
{
return null;
}
}
public static ResultQuery ConvertToResultQuery(object result)
{
return new ResultQuery(result);
}
其中ResultQuery只有一个包含我的服务结果的对象属性。
服务很简单,但出于某种原因,当我在邮递员中尝试时,它会给我这个错误:
在异步操作仍处于挂起状态时完成异步模块或处理程序。
VisualStudio也给了我一个警告,建议使用等待,但我不明白我应该把它放在哪里。
答案 0 :(得分:1)
您的GetBoxes
方法是异步方法,但GetBox
不是。
您说您正在GetBox
方法中进行数据库工作,但该方法中的所有内容都是同步运行的。考虑将GetBox
的签名更改为:
public async Task<GenericBox> GetBox(Box box)
{
try
{
//Do a lot of stuff with the database
//'await' database calls here
return genericBox;
}
catch (Exception e)
{
return null;
}
}
然后在您的GetBoxes
方法中,将您的foreach更改为Task.WhenAll():
var result = await Task.WhenAll(boxes.Select(x => GetBox(x)));
result
变量将是一个任务
如果你不想弄乱Task.WhenAll()
,你可以简单地await
循环中的GetBox
方法:
status.Add(await GetBox(box));