2017-08-24 5 views
0

als ich den ersten Code verwenden, gibt es perfekt Worte in DBEinfügen von Elementen in eine String-Liste

collection.Find(new BsonDocument()).ForEachAsync(X => Console.WriteLine(X.GetElement("word").Value)); 

Aber wenn ich versuche einzelnes Element zu erhalten, indem alle „Wort“ s in eine String-Liste setzen, es gibt ArgumentOutOfRangeException Fehler.

collection.Find(new BsonDocument()).ForEachAsync(X => wordStringList.Add(X.GetElement("word").Value.ToString())); 
Console.WriteLine(wordStringList[0]); 

Wie kann ich dieses Problem beheben, danke.

Antwort

0

Ihr Problem ist wahrscheinlich ein Rennen-Zustand, wie Ihr wordStringList.Add Anruf nach Ihren Console.WriteLine Anruf aufgrund der Verwendung von ForEachAsync ausgeführt wird. Sie können await die ForEachAsync und erhalten Sie das erwartete Ergebnis, oder Sie können stattdessen Select verwenden.

Hier ist ein Beispiel für die Select Ansatz.

var wordStringList = collection.Find(new BsonDocument()) 
    .Select(X => X.GetElement("word").Value)) 
    .ToList(); 

Console.WriteLine(wordStringList[0]); 

Dies setzt natürlich voraus, dass Sie mindestens einen Wert in der Liste haben.

0

Ich würde vermuten, dass, weil Sie eine asynchrone Methode verwenden, dass es nicht getan wird (oder sogar gestartet), wenn Sie versuchen, das erste Element zu schreiben. Die Liste ist also noch leer. Sie müssen wahrscheinlich für die Asynchron-Methode warten, zuerst zu vervollständigen, await oder .Wait() mit je nach Kontext

await collection.Find(new BsonDocument()).ForEachAsync(X => wordStringList.Add(X.GetElement("word").Value.ToString())); 
Console.WriteLine(wordStringList[0]); 

oder

collection.Find(new BsonDocument()).ForEachAsync(X => wordStringList.Add(X.GetElement("word").Value.ToString())).Wait(); 
Console.WriteLine(wordStringList[0]); 

Das await Schlüsselwort wird nur aus einer Asynchron-Methode arbeiten, während .Wait() funktioniert in asynchronen und nicht asynchronen Methoden.

Ich bin nicht nicht sachkundig genug, um auf dem Thema, den Unterschied zwischen await und .Wait() erklären, so dass Sie, dass bis woanders suchen müssen, aber von dem, was ich verstehe, await ist bevorzugt, wenn verfügbar.

Verwandte Themen