2013-04-30 11 views
6

WPF uygulamamda bir HTTP çağrısıyla bir veritabanını sorgularken async/beklemeyi kullanmak istiyorum. Async/beklemeyi ilk defa kullanıyorum, bu yüzden herhangi bir bariz hata görürseniz, onları işaret etmekte özgürsünüz.Async/Await İade edilen iterate Görev <IEnumerable <SomeClass>>

Sorun şu ki, geri dönen koleksiyon üzerinde artık yineleyemiyor, çünkü artık bir <IEnumerable<SomeClass>> Görevidir ve ne öğrendiğime göre Görev IEnumerable/IEnumerator uygulamıyor.

Kodum şuna benziyor: Async/await yöntemini çağıran yöntem.

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

yöntem GetDrawingsAsync:

Geri bitirmek için zaman uyumsuz yöntem için bekler yöntemine
public async Task<IEnumerable<Drawing>> GetDrawingsAsync(int projectId) 
{ 
    var drawings = Task.Factory.StartNew(() => _client.Get(new GetDrawingsReq() { ProjectId = projectId })); 
    return await drawings; 
} 

: Ben iade tip Task<IEnumerable<Drawing>> dönüştürmek mümkün olacaktır nasıl

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 döngüsünde tekrarlayabileceğim bir şey.

cevap

6

Task sonucu üzerinde yinelemek için, Task sonucunu almanız gerekir. Bunu yapmak için await'u kullanmalısınız. Bu, bir async yöntem haline AddProjectDrawingAndComponentsFromServerToLocalDbAsync() değişmelidir anlamı: muhtemelen yöntemini değiştirmek gerekir, böylece artık Task döndürür Bu AddProjectDrawingAndComponentsFromServerToLocalDbAsync() (BTW bir yöntem için oldukça kötü bir isimdir, sanırım) anlamına gelir

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

o onu da async yöntemine çağırır. Bu “async all the way” yol açar, ancak bu kaçınılmaz.

İlgili konular