32

一意の ID に従ってコレクションからドキュメントを取得する、非常に単純なクエリを作成しています。いくつかの欲求不満の後(私はmongoとasync / awaitプログラミングモデルが初めてです)、私はこれを理解しました:

IMongoCollection<TModel> collection = // ...
FindOptions<TModel> options = new FindOptions<TModel> { Limit = 1 };
IAsyncCursor<TModel> task = await collection.FindAsync(x => x.Id.Equals(id), options);
List<TModel> list = await task.ToListAsync();
TModel result = list.FirstOrDefault();
return result;

それはうまくいきます!しかし、「検索」メソッドへの参照が引き続き表示され、これを解決しました。

IMongoCollection<TModel> collection = // ...
IFindFluent<TModel, TModel> findFluent = collection.Find(x => x.Id == id);
findFluent = findFluent.Limit(1);
TModel result = await findFluent.FirstOrDefaultAsync();
return result;

結局のところ、これもうまくいきます。

これらの結果を達成するために 2 つの異なる方法があることには、何らかの重要な理由があると確信しています。これらの方法論の違いは何ですか? また、どちらか一方を選択する必要があるのはなぜですか?

4

2 に答える 2

0

このコードを Web リクエストで実行すると想像してください。find メソッドを呼び出すと、リクエストのスレッドは、データベースが結果を返すまで凍結されます。これは同期呼び出しです。完了までに数秒かかる長いデータベース操作の場合は、次のいずれかになります。 Web 要求を処理するために使用できるスレッドは、データベースが結果を返すのを待つだけで何もせず、貴重なリソースを浪費します (スレッド プール内のスレッドの数は制限されています)。

FindAsync を使用すると、データベースが結果を返すのを待っている間、Web 要求のスレッドが解放されます。これは、データベースの呼び出し中に、このスレッドが別の Web 要求に自由に参加できることを意味します。データベースが結果を返すと、コードは実行を継続します。

ファイル システムからの読み取り/書き込み、データベース操作、別のサービスとの通信などの長時間の操作では、非同期呼び出しを使用することをお勧めします。結果を待っている間、スレッドは別の Web 要求を処理するために使用できるためです。これはよりスケーラブルです。

このマイクロソフトの記事https://msdn.microsoft.com/en-us/magazine/dn802603.aspxをご覧ください。

于 2015-06-04T18:07:16.530 に答える