新的C#驱动程序完全是Async,在我的理解中,在n层体系结构中有点旧的设计模式,例如DAL。
在我使用的Mongo DAL中:
public T Insert(T entity){
_collection.Insert(entity);
return entity;
}
这样我就可以获得持久的ObjectId
。
今天,一切都是异步,例如InsertOneAsync
当Insert
完成后,entity
方法现在将如何返回InsertOneAsync
?你能举个例子吗?
答案 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();
}