【发布时间】:2021-06-10 06:15:43
【问题描述】:
鉴于此 Entity Framework Core sn-p
using (var scope = serviceProvider.CreateScope()) {
var ctx = scope.ServiceProvider.GetRequiredService<IEFCoreDataContext>();
// async operations on ctx and entity (see below for entity)
await ctx.SaveChangesAsync();
}
以及我想以并发方式使用它的实体列表。我第一次尝试
await Task.Run(() => Parallel.ForEach(list, async entity => {
<snippet>
});
这在 SaveChangesAsync 中因并发问题 (DataContext) 失败。 然后我尝试了
await Task.WhenAll(
list.Select(
async entity => {
<snippet>
}
)
);
这成功了。 我知道他们做事不同(ForEach 对输入列表进行分区,...),但是我想了解 Foreach 版本失败时的情况。
【问题讨论】:
-
@IvanStoev Task.WhenAll 实际上确实适用于 IEnumerable
,无需具体化它 (docs.microsoft.com/en-us/dotnet/api/…) -
目标数据库是什么?有没有可能是Oracle?
-
数据库是 SQL Server
-
附带说明,
Parallel.ForEach方法 is not async-friendly。使用异步委托提供Parallel.ForEach是一个错误。它没有做你期望它做的事情。 -
await Task.WhenAll(...成功的一个可能原因是异步操作实际上是同步执行的,所以它们是序列化的。您能否使用日志记录或其他方式验证SaveChangesAsync操作确实是同时执行的?
标签: c# concurrency entity-framework-core