【问题标题】:Should I use synchronous or asynchronous methods of c# mongodb driver?我应该使用 c# mongodb 驱动程序的同步方法还是异步方法?
【发布时间】:2017-05-31 05:38:41
【问题描述】:

在c#mongodb驱动中,有同步和异步两种方式,如下图?

_mongoCollection.InsertOneAsync(entity);
_mongoCollection.Insert(entity);

我相信,在大多数情况下,数据访问层异步完成的工作量非常少。所以我立即等待数据库调用如下:

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

现在我的问题是:当我立即等待数据库调用时,我在这里没有看到任何异步方法的使用。那么,我应该使用异步方法吗? (或)我应该使用同步方法吗?

【问题讨论】:

    标签: c# mongodb async-await


    【解决方案1】:

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

    假设 Mongo 数据库在另一台服务器上。即使有一个快速的网络和快速的 Mongo 实例,每个命令仍然可能需要 5ms,在 2GHz CPU 上是 1000 万个时钟周期。虽然您不会让所有这些都用于运行代码,但由于各种开销,您仍然会获得优势如果您有一个可以有效使用额外线程的应用程序。

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

    --

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

    【讨论】:

      【解决方案2】:

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

      例如

      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
         .
         .
         .
       }
      

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

      所以这完全取决于要求。

      【讨论】:

        【解决方案3】:

        这真的取决于您的要求。

        从您发布的代码中我可以猜到您不需要异步调用,但它可能会在最后一次调用时派上用场_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;
        

        说实话,我认为没有任何其他理由使用异步调用。

        我的观点是,从你的例子来看,异步调用的使用是没用的。

        【讨论】:

          猜你喜欢
          • 2019-12-02
          • 1970-01-01
          • 2020-11-19
          • 2012-09-22
          • 1970-01-01
          • 2020-12-19
          • 2018-01-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多