Async/Await迭代返回的Task <IEnumerable <SomeClass >>

msk*_*t86 6 c# async-await

我想在我的WPF应用程序中使用HTTP调用查询数据库时使用async/await.这是我第一次使用async/await,所以如果你看到任何明显的错误,请随意指出它们.

问题是,我不能再遍历返回的收集,因为它现在是一个任务<IEnumerable<SomeClass>>,并且从我发现,任务不实现IEnumerable/IEnumerator.

我的代码如下所示:调用async/await方法的方法.

private void AddProjectDrawingAndComponentsFromServerToLocalDbAsync(CreateDbContext1 db, Project item)
{
   var drawings = client.GetDrawingsAsync(item.ProjectId);
   ..... (waiting for GetDrawingsAsync to return, so i can iterate over the drawings)
   db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

GetDrawingsAsync方法:

public async Task<IEnumerable<Drawing>> GetDrawingsAsync(int projectId)
{
    var drawings = Task.Factory.StartNew(() => _client.Get(new GetDrawingsReq() { ProjectId = projectId }));
    return await drawings;
}
Run Code Online (Sandbox Code Playgroud)

返回等待异步方法完成的方法:

private void AddProjectDrawingAndComponentsFromServerToLocalDbAsync(CreateDbContext1 db, Project item)
{
    var drawings = client.GetDrawingsAsync(item.ProjectId);  <-- The returned Task<Task<IEnumerable<Drawing>>
    Drawing prj_drawing = null;
    foreach (var draw in drawings)
    {
        prj_drawing = new Drawing() { DrawingKey = draw.DrawingKey, Name = draw.Name, ProjectId = item.ProjectId };
        item.AddDrawing(prj_drawing);
        db.Projects.Add(item);
    }
    db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我怎么能将返回的类型转换为Task<IEnumerable<Drawing>>我可以在foreach循环中迭代的东西.

svi*_*ick 8

要迭代结果Task,你需要得到结果Task.要做到这一点,你应该使用await.这意味着你应该AddProjectDrawingAndComponentsFromServerToLocalDbAsync()改成一个async方法:

private async Task AddProjectDrawingAndComponentsFromServerToLocalDbAsync(
    CreateDbContext1 db, Project item)
{
    var drawings = await client.GetDrawingsAsync(item.ProjectId);
    foreach (var draw in drawings)
    {
        // whatever
    }
    db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

这意味着AddProjectDrawingAndComponentsFromServerToLocalDbAsync()(我觉得这对于一个方法而言,这是一个非常糟糕的名称)现在返回一个Task,所以你应该将调用它的async方法改为一个方法.这导致"一路异步",但这是不可避免的.