2017-01-22 95 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; 
} 
相關問題