gpt4 book ai didi

c# - Entity Framework 6.1.0 SaveChangesAsync

转载 作者:可可西里 更新时间:2023-11-01 09:04:09 28 4
gpt4 key购买 nike

我有 EF 帮助程序类可以异步保存更改:

public async Task<int> SaveOrUpdateAsync<TEntity>(TEntity entity)
where TEntity : class, IContextEntity
{
if (entity.Id == 0)
context.Set<TEntity>().Add(entity);
else
{
TEntity dbEntry = context.Set<TEntity>().Find(entity.Id);
if (dbEntry != null) dbEntry = entity;
}

return await context.SaveChangesAsync();
}

public void Save()
{
Task saveEntit1Async = repository.SaveOrUpdateAsync<Entity1>(entity1);
Task saveEntity2Async = repository.SaveOrUpdateAsync<Entity2>(entity2);
Task saveEntity3Async = repository.SaveOrUpdateAsync<Entity3>(Entity3);

Task.WaitAll(saveEntit1Async, saveEntity2Async, saveEntity3Async);

string test = "test";
)

通话卡住

Task.WaitAll(saveEntit1Async, saveEntity2Async, saveEntity3Async);

线,永远不会到达

 string test = "test";

但是如果我运行它:

public void Save()
{
repository.SaveOrUpdateAsync<Entity1>(entity1);
repository.SaveOrUpdateAsync<Entity2>(entity2);
repository.SaveOrUpdateAsync<Entity3>(Entity3);

string test = "test";
)

它工作正常,正在保存所有更改并到达

string test = "test";

为什么是

Task.WaitAll(saveEntit1Async, saveEntity2Async, saveEntity3Async);

卡住操作并且永远不会将调用传递给下一行代码 (string test = "test";) ?

最佳答案

我想通了!

这是发生的问题,当您使用“等待”方法等待任务或直接从任务的“结果”属性中获取结果时,您阻塞了主线程同时。当任务最终在线程池中的该方法 (SaveOrUpdateAsync(TEntity entity)) 内完成时,它将调用延续以回发到主线程(因为它从未离开过它),因为 SynchronizationContext.Current 可用并被捕获.但是这里有一个问题:主线程被“等待”方法阻塞,这就是我遇到死锁的原因!

为了解决死锁问题,我必须指定不继续为 context.SaveChangesAsync() 捕获的上下文。

public async Task<int> SaveOrUpdateAsync<TEntity>(TEntity entity)
where TEntity : class, IContextEntity
{
if (entity.Id == 0)
context.Set<TEntity>().Add(entity);
else
{
TEntity dbEntry = context.Set<TEntity>().Find(entity.Id);
if (dbEntry != null) dbEntry = entity;
}

return await context.SaveChangesAsync().ConfigureAwait(continueOnCapturedContext: false);
}

关于c# - Entity Framework 6.1.0 SaveChangesAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22867997/

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