Async/Await迭代返回的Task>

本文关键字:IEnumerable SomeClass Task Await 迭代 返回 Async | 更新日期: 2023-09-27 18:11:34

我想在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();
}

方法GetDrawingsAsync:

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

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

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();
}

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

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

要迭代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();
}

这意味着AddProjectDrawingAndComponentsFromServerToLocalDbAsync()(这是BTW相当一个坏名字的方法,我认为)现在返回一个Task,所以你可能应该改变方法,调用它到一个async方法太。这将导致"始终异步",但这是不可避免的。