Loops 异步&;在循环中等待多个任务,如何返回单个任务
本例使用的是实体框架,但问题更多的是如何在循环中等待多个Loops 异步&;在循环中等待多个任务,如何返回单个任务,loops,task-parallel-library,async-await,c#-5.0,entity-framework-6,Loops,Task Parallel Library,Async Await,C# 5.0,Entity Framework 6,本例使用的是实体框架,但问题更多的是如何在循环中等待多个async任务。假设我在自定义DbContext类上有以下方法: 公共异步任务丢弃ChangesSync() { foreach(ChangeTracker.Entries()中的var条目,其中(x=>x!=null)) { 开关(进入状态) { 案例实体状态。添加: entry.State=EntityState.Detached; 打破 案例实体状态。已修改: entry.State=EntityState.Unchanged; 打破
async
任务。假设我在自定义DbContext
类上有以下方法:
公共异步任务丢弃ChangesSync()
{
foreach(ChangeTracker.Entries()中的var条目,其中(x=>x!=null))
{
开关(进入状态)
{
案例实体状态。添加:
entry.State=EntityState.Detached;
打破
案例实体状态。已修改:
entry.State=EntityState.Unchanged;
打破
案例实体状态。已删除:
等待entry.ReloadAsync();//严格回答您的问题:
公共任务丢弃更改同步()
{
列表任务=新列表();
foreach(ChangeTracker.Entries()中的var条目,其中(x=>x!=null))
{
开关(进入状态)
{
案例实体状态。添加:
entry.State=EntityState.Detached;
打破
案例实体状态。已修改:
entry.State=EntityState.Unchanged;
打破
案例实体状态。已删除:
tasks.Add(entry.ReloadAsync());
打破
}
}
返回任务。WhenAll(任务);
}
不过,让EF一次处理所有这些文件可能更有效:
公共任务丢弃更改同步()
{
列表已删除=新列表();
foreach(ChangeTracker.Entries()中的var条目,其中(x=>x!=null))
{
开关(进入状态)
{
案例实体状态。添加:
entry.State=EntityState.Detached;
打破
案例实体状态。已修改:
entry.State=EntityState.Unchanged;
打破
案例实体状态。已删除:
删除。添加(条目);
打破
}
}
返回ctx.RefreshAsync(RefreshMode.StoreWins,已删除);
}
严格回答您的问题:
公共任务丢弃更改同步()
{
列表任务=新列表();
foreach(ChangeTracker.Entries()中的var条目,其中(x=>x!=null))
{
开关(进入状态)
{
案例实体状态。添加:
entry.State=EntityState.Detached;
打破
案例实体状态。已修改:
entry.State=EntityState.Unchanged;
打破
案例实体状态。已删除:
tasks.Add(entry.ReloadAsync());
打破
}
}
返回任务。WhenAll(任务);
}
不过,让EF一次处理所有这些文件可能更有效:
公共任务丢弃更改同步()
{
列表已删除=新列表();
foreach(ChangeTracker.Entries()中的var条目,其中(x=>x!=null))
{
开关(进入状态)
{
案例实体状态。添加:
entry.State=EntityState.Detached;
打破
案例实体状态。已修改:
entry.State=EntityState.Unchanged;
打破
案例实体状态。已删除:
删除。添加(条目);
打破
}
}
返回ctx.RefreshAsync(RefreshMode.StoreWins,已删除);
}
为了调用RefreshAsync
,我必须将this
转换为IObjectContextAdapter
。有什么问题吗?想知道为什么他们在DbContext
中忽略了该方法。另外,参数不应该是RefreshMode.StoreWins
而不是RefreshMode.OverwriteCurrentValues
?会让你感到困惑t第二个更有效的选项在运行时失败。将DbContext
强制转换为IObjectContextAdapter
并使用RefreshMode.StoreWins
将其编译后,我的集成测试失败“要刷新的对象集合中索引0处的元素具有null EntityKey属性值或未附加到此ObjectStateManager。"但是,第一个严格的答案并没有通过集成测试。啊,我给了你一个SQLRefreshMode
的LINQ。你是正确的RefreshMode。StoreWins
是正确的答案。我以为我以前这么做是为了取消删除实体,但我猜我错了。我必须将这个转换为IObjectContextAdapter
为了调用RefreshAsync
。有什么问题吗?想知道为什么他们在DbContext
中忽略了该方法。另外,参数不应该是RefreshMode。StoreWins
而不是RefreshMode。OverwriteCurrentValues
?在运行时第二个更有效的选项失败。在抛出DbContext之后
到IObjectContextAdapter
并使用RefreshMode.StoreWins
将其编译,我的集成测试失败,原因是“要刷新的对象集合中索引0处的元素具有null EntityKey属性值或未附加到此ObjectStateManager。”但是,第一个严格的答案并没有通过集成测试。啊,我给了你一个SQLRefreshMode
的LINQ。你是正确的RefreshMode。StoreWins
是正确的答案。我以为我以前这么做是为了取消删除实体,但我想我错了。