Imはコードを書き出しようとしています。FindAsyncエクステンションでmongodbデッドロックが発生する可能性があります
using (var cursor = await SomeCollection.FindAsync(filter, options))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var item in batch)
{
//do something
}
}
}
私は拡張子を思い付いた: すべてのFindAsync
に私たちが書くために必要なコードのこの作品があります。私のコード:
public static async Task<List<T>> GetResultsFromFindAsync<T>(this Task<IAsyncCursor<T>> find)
{
List<T> result = new List<T>();
using (var cursor = await find)
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var item in batch)
{
result.Add(item);
}
}
}
return result;
}
、今、私が唯一の使用:
List<MyObject> lst = await SomeCollection.FindAsync(filter, options).GetResultsFromFindAsync();
質問です:単一Await
caluseとプロセスに関与する2つの非同期タスクがあるので、それがデッドロックを引き起こす可能性があります。 私はプロセスに本当に2つのAwait
calusesが含まれていることを知っていますが、お互いに葛藤したり、データの損失を引き起こしたりすることはありませんか?
このエクステンションを使用してFindAsyncを実行し、データを取得しました。そのため、テストではデッドロックが発生する可能性があります。
私は非常に理由や理由を知りたいと思います。おかげさまで
のawaitなく.Resultまたは.WAITを使用してすべての私の前のコール。私はそれらが発生するデッドロック効果について知っています。したがって、「非デッドロック」コードとしてまとめてください。同意する? –
@OriRefael、yep、それはそれを要約します。内部タスクが完了する前に外部タスクが大量の作業を進めることができないため、ここでは「データ損失」の問題もありません。 –