C# MongoDB FindAsync 永远不会返回 Await

标签 c# mongodb azure

还有其他类似的问题,但据我所知与实际的 FindAsync 无关。

我的 ClientsController 调用 ClientService.GetClients,它使用 mongo 驱动程序查询 Azure 上的 mongodb。

单步执行调试器,直到我调用clientCollection.FindAsync。如果我跨过此行,则永远不会命中下面的行,并且不会给出任何错误。就像等待的任务永远不会返回一样。

public async Task<List<Client>> GetClients(SearchRequestDTO searchRequest)
{
  var response = new List<Client>();

  var db = _databaseUtilityService.GetCoreDatabase();
  var clientCollection = db.GetCollection<Client>(Properties.Settings.Default.ClientCollectionName);

  var cursor = await clientCollection.FindAsync(new BsonDocument());

  while (await cursor.MoveNextAsync())
  {
    response.Concat(cursor.Current.ToList());
  }

  return response;
}

调试器从不跨过 varcursor = ... 行的原因是什么?

编辑-

我可以得到结果-

var 光标 = clientCollection.FindAsync(new BsonDocument()).Result;

但我不确定这就是我想要做的。

public async Task<List<Client>> GetClients(SearchRequestDTO searchRequest)
{
  var db = _databaseUtilityService.GetCoreDatabase();
  var clientCollection = db.GetCollection<Client>(Properties.Settings.Default.ClientCollectionName);
  var results = clientCollection.FindAsync(new BsonDocument()).Result;

  return results.ToList();
}

最佳答案

由于没有太多关于上下文的信息,所以我想出了模拟类来满足问题。

请参阅下面的重载方法,当调用时,它将始终返回包含三个记录的列表。现在你的代码有什么问题吗?我相信它在你的 while 循环中。您正在调用导致问题的 response.Concat。 我改为调用 response.AddRange 并且它有效。

public async Task<List<Client>> GetClients()
{
    var mongoUri = "mongodb://localhost:27017";
    var mongoClient = new MongoClient(mongoUri);

    var mongoDatabase = mongoClient.GetDatabase("ClientDB");
    var clientCollection = mongoDatabase.GetCollection<Client>("Clients");

    // Empty collection to always get accurate result.
    clientCollection.DeleteMany(new BsonDocument());

    // Insert some dummy data
    clientCollection.InsertOne(new Client() {Address = "One street, some state", ZipCode = 11111});
    clientCollection.InsertOne(new Client() { Address = "2nd street, some state", ZipCode = 22222 });
    clientCollection.InsertOne(new Client() { Address = "Third street, some state", ZipCode = 33333 });

    var response = new List<Client>();
    var cursor = await clientCollection.FindAsync(new BsonDocument());

    while (await cursor.MoveNextAsync())
    {
        response.AddRange(cursor.Current);
    }

    return response;
}

关于C# MongoDB FindAsync 永远不会返回 Await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41794435/

相关文章:

c# - 如何使用 C# 将整个文件读取为字符串?

javascript - dropCollection 不会删除集合

node.js - MongoDB $lookup 结果作为对象而不是数组

python - 异步运行 Azure Durable Function

c# - 任务不能并行运行

c# - Nhibernate - 与 Cascade all-delete-orphan 一对一映射,不删除孤儿

c# - 在尊重偏好的情况下将人员分配到建筑物?

javascript - 尝试使用 Express.js 和 Jade 从 MongoDB 数据库中删除条目

azure - 为什么可以将资源移动到 Azure 中的只读资源组?

asp.net - Web.config 中的 Razor Host 部分和 Razor Pages 部分是什么