gpt4 book ai didi

c# - 异步/等待迭代返回的 Task>

转载 作者:太空狗 更新时间:2023-10-29 21:23:04 24 4
gpt4 key购买 nike

在我的 WPF 应用程序中通过 HTTP 调用查询数据库时,我想使用异步/等待。这是我第一次使用 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 循环中迭代的东西。

最佳答案

要迭代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()(顺便说一句,我认为这是一个非常糟糕的方法名称)现在返回一个 Task,因此您可能应该更改该方法这也将它调用到 async 方法中。这导致 “async all the way” ,但这是不可避免的。

关于c# - 异步/等待迭代返回的 Task<IEnumerable<SomeClass>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16297966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com