2017-01-22 11 views
1

このような他の質問がありますが、実際のFindAsyncとは関係がありません。C#MongoDB FindAsyncはAwaitで返さない

私のClientsControllerは、mongoドライバを使用してAzureのmongodbを照会するClientService.GetClientsを呼び出します。

私が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

コンテキストに関する情報はあまりないので、私は疑問を満たすためにモッククラスを思いついた。

下記のオーバーロードされたメソッドを参照してください。呼び出されると、常に3つのレコードのリストが返されます。今あなたのコードに何が間違っていますか?私はそれがあなたの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; 
} 
関連する問題