2013-04-30 44 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」,但這是不可避免的。

相關問題