2017-01-22 96 views
1

还有其他一些问题,像这个,但与我可以告诉的实际FindAsync无关。C#MongoDB FindAsync永远不会返回等待

ClientsController电话ClientService.GetClients它采用蒙戈司机查询在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; 
} 

调试器从未跨过var cursor = ...行的原因是什么?

编辑 -

我可以代替得到Result -

var cursor = 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(); 
} 
+0

在下一行放置一个断点。当涉及线程切换时,调试器很可能会失去对任务延续的跟踪。 –

+0

听起来就像那样。但是,当我继续''继续' –

+0

它不会与同步呼叫一起工作吗?如果您调用Find()并通过MoveNext遍历Cursor,是否会得到任何文档?或者你的收藏是空的? –

回答

0

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

请在下面看到一个重载的方法,当它被调用时,它总会返回三个记录的列表。现在你的代码出了什么问题?我相信这是在你的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; 
} 
相关问题