2017-08-24 207 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者優先時可用。