2013-04-30 1 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; 
} 

: I가 반환 유형 Task<IEnumerable<Drawing>>을 변환 할 수있을 것입니다 방법

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

을 뭔가 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”이 발생하지만 이는 불가피합니다.

관련 문제