Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 异步&;在循环中等待多个任务,如何返回单个任务_Loops_Task Parallel Library_Async Await_C# 5.0_Entity Framework 6 - Fatal编程技术网

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。"但是,第一个严格的答案并没有通过集成测试。啊,我给了你一个SQL
RefreshMode
的LINQ。你是正确的
RefreshMode。StoreWins
是正确的答案。我以为我以前这么做是为了取消删除实体,但我猜我错了。我必须将
这个
转换为
IObjectContextAdapter
为了调用
RefreshAsync
。有什么问题吗?想知道为什么他们在
DbContext
中忽略了该方法。另外,参数不应该是
RefreshMode。StoreWins
而不是
RefreshMode。OverwriteCurrentValues
?在运行时第二个更有效的选项失败。在抛出
DbContext之后
IObjectContextAdapter
并使用
RefreshMode.StoreWins
将其编译,我的集成测试失败,原因是“要刷新的对象集合中索引0处的元素具有null EntityKey属性值或未附加到此ObjectStateManager。”但是,第一个严格的答案并没有通过集成测试。啊,我给了你一个SQL
RefreshMode
的LINQ。你是正确的
RefreshMode。StoreWins
是正确的答案。我以为我以前这么做是为了取消删除实体,但我想我错了。