在c#mongodb驱动程序中,有可用的同步和异步方法,如下所示?
_mongoCollection.InsertOneAsync(entity);
_mongoCollection.Insert(entity);
我相信,在大多数情况下,在数据访问层中异步完成的工作量非常少。所以我正在等待数据库调用,如下所示:
await _mongoCollection.InsertOneAsync(entity);
await _mongoCollection.DeleteOneAsync(query);
await _mongoCollection.Find(query).ToListAsync();
现在我的问题是:由于我正在等待db调用,我在这里没有看到任何异步方法的使用。那么,我应该使用异步方法吗? (或)我应该使用同步方法吗?
答案 0 :(得分:5)
我认为先前的答案缺少一个重要的异步点;即,当您使用异步方法**时,您可以释放您在(大部分)I / O操作完成时所处的线程,并且它可以在您的应用程序的其他位置使用;例如为其他请求提供服务。
假设Mongo数据库在另一台服务器上。即使使用快速网络和快速Mongo实例,每个命令仍然可能是5ms,而在2GHz CPU上则是1000万个时钟周期。虽然您不会在运行代码时使用所有这些代码,但由于各种开销,您仍然可以获得优势如果您有一个可以使用其他线程的应用程序高效。
因此,如果您的应用程序是网站,API或UI,我会使用异步方法。如果它是一个单线程控制台应用程序,您可能无法获得上述任何好处。
-
**这假设Mongo异步方法是真正的异步方法,而不仅仅是同步方法的包装器。
答案 1 :(得分:1)
这实际上取决于您的要求。
从您发布的代码中我可以猜测您不需要异步调用,但它可能会在最后一次调用时派上用场_mongoCollection.Find(...).ToListAsync()
只有在具有某些独立/复杂逻辑时才应使用异步调用(IMHO)。在您展示的示例中,我认为您只能await
进行最后一次调用:
_mongoCollection.Insert(entity);
_mongoCollection.Find(query).ToListAsync();
这样,您可以在等待ToListAsync()
时简单地执行一些额外的逻辑:
_mongoCollection.Insert(entity);
Task<List<object>> _task = _mongoCollection.Find(query).ToListAsync();
// my complex logic/calculations and stuff
await _task;
100%诚实,我没有看到任何其他原因使用异步调用。
我的意见是,从你的例子来看,使用异步调用是没用的。
答案 2 :(得分:0)
取决于你是否在下一个陈述中使用了结果。
例如。
void async myMethod(){
var result = funcAsync();
// do some additional work..
var data = await result;
.
.
}
上面是你应该使用异步等待的场景。
现在假设你有方法;
void async myMethod(){
var result = await funcAsync(); // here result is required before any other logic ahead
.
.
.
}
在这里你真的不需要使用async await,但是如果在不久的将来你的系统发生了变化并且你需要在其间添加额外的代码,那么你可能需要更改方法签名和调用该方法的相应位置。
所以这完全取决于要求。