2013-04-30 41 views
6

我想在我的WPF应用程序中使用HTTP调用查询数据库时使用async/await。这是我第一次使用异步/等待,所以如果你看到任何明显的错误,请随时指出。异步/等待迭代返回的任务<IEnumerable <SomeClass>>

问题是,即时通讯无法迭代返回的收集了,因为它现在是一个任务<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循环中迭代的东西。

回答

6

要遍历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方法。这导致“async all the way”,但这是不可避免的。

相关问题