【问题标题】:Async/Await Iterate over returned Task<IEnumerable<SomeClass>>异步/等待迭代返回的 Task<IEnumerable<SomeClass>>
【发布时间】:2013-04-30 10:44:16
【问题描述】:

我想在我的 WPF 应用程序中通过 HTTP 调用查询数据库时使用 async/await。这是我第一次使用 async/await,所以如果您发现任何明显的错误,请随时指出。

问题是,我无法再遍历返回的收集,因为它现在是&lt;IEnumerable&lt;SomeClass&gt;&gt; 的任务,并且据我发现,该任务没有实现 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&lt;IEnumerable&lt;Drawing&gt;&gt; 转换为可以在 foreach 循环中迭代的类型。

【问题讨论】:

    标签: c# async-await


    【解决方案1】:

    要遍历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()(顺便说一句,我认为这是一个相当糟糕的方法名称)现在返回一个Task,因此您可能应该将调用它的方法也更改为async 方法。这导致“async all the way”,但这是不可避免的。

    【讨论】:

      猜你喜欢
      • 2014-06-11
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多