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

Vik*_*eni 4 c# mongodb async-await

在c#mongodb驱动程序中,有同步和异步方法,如下所示?

_mongoCollection.InsertOneAsync(entity);
_mongoCollection.Insert(entity);
Run Code Online (Sandbox Code Playgroud)

我相信,在大多数情况下,在数据访问层中异步完成的工作量会很少。因此,我正在等待数据库调用,如下所示:

await _mongoCollection.InsertOneAsync(entity);
await _mongoCollection.DeleteOneAsync(query);
await _mongoCollection.Find(query).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:由于我正在等待数据库调用,因此这里没有看到异步方法的使用。那么,我应该使用异步方法吗?(或)我应该使用同步方法吗?

sel*_*ape 6

我认为先前的答案缺少异步的要点;也就是说,当您使用异步方法**时,您将在(大部分)I / O操作完成时释放正在使用的线程,并且该线程可在您应用程序的其他位置使用;例如,为其他请求提供服务。

假设Mongo数据库位于另一台服务器上。即使有了快速的网络和快速的Mongo实例,每个命令仍然可能需要5毫秒的时间,在2GHz CPU上,这是1000万个时钟周期。尽管由于各种开销而不会让所有这些代码都可以在运行代码时使用,但是如果您拥有可以高效使用附加线程的应用程序,您仍将获得好处。

因此,如果您的应用是例如网站,API或UI,那么我将使用异步方法。如果它是单线程控制台应用程序,那么您可能不会获得任何上述好处。

-

**这假设Mongo异步方法是真正的异步方法,而不仅仅是同步方法的包装器。


A.T*_*.T. 1

这取决于您是否在下一个语句中使用结果。

例如

void async myMethod(){
   var result = funcAsync();
   // do some additional work..
   var data = await result;
   .
   .
 }
Run Code Online (Sandbox Code Playgroud)

上面是您应该使用异步等待的场景。

现在假设你有方法;

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

在这里,您确实不需要使用异步等待,但是如果在不久的将来您的系统发生变化并且您需要在其间添加额外的代码,那么您可能需要更改方法签名和调用该方法的相应位置。

所以这完全取决于要求。