异步操作仍在等待中

时间:2017-03-09 16:59:36

标签: c# asp.net asynchronous

我试图创建一个服务来从数据库中获取所有我的框:

[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也给了我一个警告,建议使用等待,但我不明白我应该把它放在哪里。

1 个答案:

答案 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));