异步方法,包括对结果的异步调用和同步操作

我正在尝试创建一个异步方法,我可以多次调用并等待以后 – 该方法应该进行数据库调用,等待结果,一旦有结果就做一些操作,然后返回最终结果。 它看起来像这样:

public async Task GetSomethingFromDbAndSelectSomethingOnServer() { //stuff is just an Entity Framework database call var stuff = await myEfDbContext.StuffTable.ToListAsync(); long itemsCount = stuff.Where(someQueryThatCantGoToDb).Count(); return itemsCount; } 

这似乎是一个明显的错误,因为我将返回类型指定为Task,而实际上我只返回了很长时间。 这会编译,但抛出exception:

EntityFramework.dll中发生了’System.NotSupportedException’类型的第一次机会exception

我打算像这样使用这个代码:

 Task myAsyncCall = GetSomethingFromDbAndSelectSomethingOnServer(); long myCount = await myAsyncCall; 

这可能有点无关紧要,但是为了详细说明,这里有一些好处:

 Task pendingItemCountCall = _mongoItems.Find(filter).CountAsync(); long myCount2 = await pendingItemCountCall; 

当然,区别在于它只是对db的异步调用,没有进一步的操作,我正在尝试在SQL调用中执行此问题。

编辑:

所以,实际上,这似乎是违规行:

 var stuff = await myEfDbContext.StuffTable.ToListAsync(); 

如果我对此进行注释并手动设置计数var,那么代码就会出现。 我很困惑,但我对整体问题更感兴趣 – 我是否在这里正确使用异步,不一定是我的特定错误的错误。

您无法在同一上下文中等待多个查询。 您必须为每个操作使用自己的上下文:

 public async Task GetSomethingFromDbAndSelectSomethingOnServer() { using(var context = new MyEfDbContext()) { // include the following if you do not need lazy loading and want some more speed context.Configuration.AutoDetectChangesEnabled = false; context.Configuration.ProxyCreationEnabled = false; var stuff = await myEfDbContext.StuffTable.ToListAsync(); long itemsCount = stuff.Where(someQueryThatCantGoToDb).Count(); return itemsCount; } }