我应该使用C# MongoDB驱动程序的同步还是异步方法?

6
在C# MongoDB驱动程序中,有同步和异步方法可用,如下所示:
_mongoCollection.InsertOneAsync(entity);
_mongoCollection.Insert(entity);

我认为,在大多数情况下,数据访问层异步完成的工作量非常少。因此,我会立即等待数据库调用,如下所示:

await _mongoCollection.InsertOneAsync(entity);
await _mongoCollection.DeleteOneAsync(query);
await _mongoCollection.Find(query).ToListAsync();

现在我的问题是:由于我立即等待数据库调用,我看不到使用异步方法的任何用处。那么,我应该使用异步方法吗?(还是)应该使用同步方法?

3个回答

20
我认为前面的答案忽略了异步的一个重要点; 就是当你使用异步方法时,它会在(大多数)I / O操作完成时释放你所在的线程,并可用于您应用程序中的其他位置; 例如处理其他请求。
假设Mongo数据库在另一台服务器上。即使网络和Mongo实例都很快,每个命令仍然需要大约5毫秒,在2GHz CPU上相当于1000万个时钟周期。虽然由于各种开销,您无法利用所有这些运行代码,但如果您有一个可以充分利用额外线程的应用程序,则仍然会获得优势。
因此,如果您的应用程序例如是网站、API或UI,我建议使用异步方法。如果它是单线程控制台应用程序,则可能不会获得上述任何好处。
--
**这假定Mongo async 方法确实是异步的,而不仅仅是同步方法的包装器。

1
这取决于您是否在下一条语句中使用了结果。例如:
void async myMethod(){
   var result = funcAsync();
   // do some additional work..
   var data = await result;
   .
   .
 }

以上是应该使用async await的情况。

现在假设您有一个方法;

void async myMethod(){
   var result = await funcAsync(); // here result is required before any other logic ahead
   .
   .
   .
 }

在这里你真的不需要使用async await,但是如果在不久的将来您的系统发生了变化,并且您需要在其中添加其他代码,那么您可能需要更改方法签名以及调用该方法的相应位置。

因此,这完全取决于要求。


0

这真的取决于您的要求。

从您发布的代码中,我可以猜测您不需要异步调用,但是在最后一个调用_mongoCollection.Find(...).ToListAsync()中可能会派上用场。

异步调用(仅我个人意见)应仅在具有某些独立/复杂逻辑时使用。在您展示的示例中,我认为您只能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;

说实话,我没有看到使用异步调用的其他原因。

我的观点是,在你的例子中,使用异步调用是毫无意义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接