【发布时间】:2015-04-07 14:15:01
【问题描述】:
我有这段代码可以从我的数据库中检索数据:
public async Task<IEnumerable<Member>> GetAllMembersAsync()
{
var members = Repository.GetAll<Member>();
return await Task.Run(() => members.ToListAsync());
}
由于未知原因(可能是错误?),我必须使用 Task.Run 才能完成这项工作(存储库只返回一个 DbSet<Member>。如果我不这样做,我的 UI 将永远挂起。
问题是我不能以这种方式同时进行 2 个数据库操作。如果我这样做,我会收到此错误:
A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.
如你所见,我已经在使用await。
有什么办法可以解决这个问题,让我实际上可以同时进行 2 个数据库操作,从而让它们按顺序运行?
编辑: 调用它的代码:
private async void LoadMembers()
{
try
{
var members = await MemberService.GetAllMembersAsync();
Members = new ObservableCollection<Member>(members);
}
catch (EntityException)
{
// connection lost?
}
}
【问题讨论】:
-
你能显示调用你的
GetAllMembersAsync()方法的代码吗? -
好的,我已经添加了,谢谢:)
-
如何使用
.ContinueWith进行第二次异步调用?您必须在后续中启动另一项任务,但至少这些任务将是菊花链式的。不过,给这只猫剥皮的方法有很多…… -
问题是我不知道下一个异步调用是什么——用户可以决定做多件事。它可能是再次检索所有成员,或者做一些完全不同的事情;
-
然后保留对正在运行的最后一个任务的引用,如果用户继续附加数据获取操作,则将它们添加为延续。只是不要丢弃您对上次任务运行的引用。
标签: c# entity-framework asynchronous async-await