2013-04-30 5 views
6

WPFアプリケーションでHTTP呼び出しを使用してデータベースを照会するときにasync/awaitを使用します。 async/awaitを使ったのは初めてのことです。明らかな間違いがある場合は、それらを指摘してください。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を使うべきです。これは、あなたがasync方法にAddProjectDrawingAndComponentsFromServerToLocalDbAsync()を変更する必要があります意味:あなたは、おそらく方法を変更する必要がありますので、今はTask返します。これは、AddProjectDrawingAndComponentsFromServerToLocalDbAsync()(BTW方法のために非常に悪い名前ですが、私は思う)ことを意味

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

ことasyncメソッドにも呼び出します。これは“async all the way”につながりますが、やむを得ないことです。

関連する問題