我的业务逻辑层中有一些代码,它们使用一些存储库,这些存储库又使用DbContext(在数据层中)。大多数代码都是异步的。在我的业务逻辑中的某个时刻,我立刻调用了几个存储库的异步方法(Task.WhenAll...)
)
我遇到了错误A second operation started on this context before a previous asynchronous operation completed
我的观点是,业务逻辑不应该关心/了解存储库如何完成它们的工作,所以它应该能够在异步任务上使用并行性,如果“它会如此”。
所以我希望能够以A second operation
应该等到previous asynchronous operation
完成的关键时刻以异步/等待友好的方式锁定。
如何做到这一点?
当前的工作环境:忘记任务。什么时候使用等待,就像TPL一样甚至不存在
var postsResult = await _IUserLogic.GetActivePostsAsync();
var usersResult = await _IUserLogic.SearchUsersWithPostAsync(viewModel.Name, viewModel.PostId);
代码
var postsTask = _IUserLogic.GetActivePostsAsync();
var usersTask = _IUserLogic.SearchUsersWithPostAsync(viewModel.Name, viewModel.PostId);
await Ask.WhenAll(postsTask , usersTask );
var postsResult = postsTask.Result;
var usersResult = usersTask.Result;
答案 0 :(得分:1)
每个线程都需要自己的DbContext,因为DbContext不是线程安全的。但是,这里有一些解决方法。