2017-08-24 2 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コールがForEachAsyncの使用に後のあなたのConsole.WriteLineコールを実行しようとしているとして、おそらく競合状態です。 awaitForEachAsyncになり、期待される結果が得られます。代わりにSelectを使用することもできます。

ここにはSelectアプローチの例があります。

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

Console.WriteLine(wordStringList[0]); 

もちろん、これはリストに少なくとも1つの値があることを前提としています。

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を理解して何から使用可能な場合が好まれます。

関連する問題