我想在我的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;
}
返回等待异步方法完成的方法:
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循环中迭代的内容。
答案 0 :(得分:7)
要迭代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
,所以你应该把调用它的方法改成{{1}方法也是。这导致“async all the way”,但这是不可避免的。