了解MongoDB新C#驱动程序中的更改(异步和等待)

时间:2015-05-07 04:26:22

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0

新的C#驱动程序完全是Async,在我的理解中,在n层体系结构中有点旧的设计模式,例如DAL。

在我使用的Mongo DAL中:

public T Insert(T entity){
     _collection.Insert(entity);
     return entity;
}

这样我就可以获得持久的ObjectId

今天,一切都是异步,例如InsertOneAsyncInsert完成后,entity方法现在将如何返回InsertOneAsync?你能举个例子吗?

2 个答案:

答案 0 :(得分:13)

理解async / await的基础知识很有帮助,因为它有点疏漏抽象,并且有很多陷阱。

基本上,您有两种选择:

  • 保持同步。在这种情况下,分别对异步调用使用.Result.Wait()是安全的,例如

    之类的东西
    // Insert:
    collection.InsertOneAsync(user).Wait();
    
    // FindAll:
    var first = collection.Find(p => true).ToListAsync().Result.FirstOrDefault();
    
  • 在代码库中执行异步。不幸的是,异步操作非常具有传染性,所以要么将几乎所有内容转换为异步,要么不转换。小心,mixing sync and async incorrectly will lead to deadlocks。使用async有许多优点,因为您的代码可以在MongoDB仍在运行时继续运行,例如。

    // FindAll:
    var task = collection.Find(p => true).ToListAsync();
    // ...do something else that takes time, be it CPU or I/O bound
    // in parallel to the running request. If there's nothing else to 
    // do, you just freed up a thread that can be used to serve another 
    // customer...
    // once you need the results from mongo:
    var list = await task;
    

答案 1 :(得分:0)

在我的情况下:当我收到此错误时:

IQueryable源未实现 IAsyncEnumerable。仅来源 实现IAsyncEnumerable可用于实体框架 异步操作。

我已经为mongodb实现了async where函数,如下所示。

public async Task<IEnumerable<TEntity>> Where(Expression<Func<TEntity, bool>> expression = null)
{
     return await context.GetCollection<TEntity>(typeof(TEntity).Name, expression).Result.ToListAsync();
}