2017-08-24 114 views
0

当我使用的第一个代码,它完美地给出单词DB插入元素字符串列表

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

但是当我尝试把所有“字” s转换为字符串列表以获得单个元件,但给出ArgumentOutOfRangeException错误。

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

我该如何解决这个问题,谢谢。

回答

0

您的问题可能是一个竞争条件,为您的通话wordStringList.Add将运行您的通话Console.WriteLine由于使用的ForEachAsync。你可以awaitForEachAsync并得到预期的结果,或者你可以改为使用Select

下面是Select方法的示例。

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

Console.WriteLine(wordStringList[0]); 

当然,这里假定您至少有一个值在列表中。

0

我想这是因为您正在使用异步方法,即在您尝试写出第一个元素时没有完成(甚至未开始)。所以列表仍然是空的。 你可能需要等待异步方法率先完成,使用await.Wait()根据上下文

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

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

await关键字只会从异步方法内工作,而.Wait()将在异步和非异步方法中工作。

我不能没有见地足够的关于这个问题的解释await.Wait()之间的区别,所以你需要寻找的是在其它地方,但是从我的理解await者优先时可用。