7

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

async メソッドの終了を待機するメソッドに戻ります。

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 ループで反復できるものに変換するにはどうすればよいでしょうか。

4

1 に答える 1

8
于 2013-04-30T12:44:23.733 に答える