entityframework6.1.0SaveChangesAsyncIhaveEFhelperclasssavechangesasync:publicasyncTaskSaveOrUpdateAsync(TEntityentity)whereTEntity:class,IContextEntity{if(entity.Id==0)context.Set().Add(实体);else{TEntitydbEntry=context.Set().Find(entity.Id);如果(dbEntry!=null)dbEntry=实体;}returnawaitcontext.SaveChangesAsync();}publicvoidSave(){TasksaveEntit1Async=repository.SaveOrUpdateAsync(entity1);任务saveEntity2Async=repository.SaveOrUpdateAsync(entity2);任务saveEntity3Async=repository.SaveOrUpdateAsync(Entity3);Task.WaitAll(saveEntit1Async,saveEntity2Async,saveEntity3Async);字符串测试=“测试”;)呼叫卡在Task.WaitAll(saveEntit1Async,saveEntity2Async,saveEntity3Async);行,永远不会到达字符串test="test";但是如果我运行它:publicvoidSave(){repository.SaveOrUpdateAsync(entity1);repository.SaveOrUpdateAsync(entity2);repository.SaveOrUpdateAsync(Entity3);字符串测试=“测试t";)它工作正常,所有更改都被保存并且可以实现stringtest="test";为什么Task.WaitAll(saveEntit1Async,saveEntity2Async,saveEntity3Async);冻结操作并且永远不会将调用传递到下一行代码(stringtest="test";)?我想通了!这就是发生的问题,当你使用“await”方法等待任务或者直接从任务的“result”属性中获取结果时,你阻塞了main当最终任务在线程池中的那个方法(SaveOrUpdateAsync(TEntityentity))内部完成时,它会同时调用线程回发到主线程(因为它从未离开过主线程),因为SynchronizationContext.Current可用并捕获。但是这里有一个问题:主线程被“await”方法阻塞,这就是我死锁的原因!为了解决死锁问题,我必须指定上下文不继续捕获上下文.SaveChangesAsync()。publicasyncTaskSaveOrUpdateAsync(TEntityentity)whereTEntity:class,IContextEntity{if(entity.Id==0)context.Set().Add(entity);else{TEntitydbEntry=context.Set().Find(entity.Id);如果(dbEntry!=null)dbEntry=实体;}returnawaitcontext.SaveChangesAsync().ConfigureAwait(continueOnCapturedContext:false);}也许我很愚蠢(!),但为什么你的代码会说if(dbEntry!=null)dbEntry=entity;当然if语句应该是if(dbEntry==null)dbEntry=entity;我猜C#的null-coalescing运算符也可以替换这两行以上是C#学习教程:entityframework6.1.0SaveChangesAsync如果分享的内容对你有用,需要进一步了解C#学习教程,希望你会多关注—TEntitydbEntry=context.Set().Find(entity.Id)??实体;本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
