2017-01-16 9 views
2

c#mongodbドライバには、以下に示すような同期メソッドと非同期メソッドがありますか?私はc#mongodbドライバの同期または非同期のメソッドを使うべきですか?

_mongoCollection.InsertOneAsync(entity); 
_mongoCollection.Insert(entity); 

多くの場合、データアクセス層で非同期に行われる作業の量は非常に少ないと思います。だから私は、次のようにデータベースがすぐに呼び出しを待っています:

await _mongoCollection.InsertOneAsync(entity); 
await _mongoCollection.DeleteOneAsync(query); 
await _mongoCollection.Find(query).ToListAsync(); 

今、私の質問をされています。私はデシベルを待っていたようすぐに呼び出して、私はここでは非同期メソッドのいずれかの使用を見ていないです。だから、非同期メソッドを使うべきですか? (または)同期メソッドを使用する必要がありますか?

答えて

0

次の文で結果を使用するかどうかによって異なります。

void async myMethod(){ 
    var result = funcAsync(); 
    // do some additional work.. 
    var data = await result; 
    . 
    . 
} 

上記は、async awaitを使用する必要があるシナリオです。

次に、メソッドがあると仮定します。ここ

void async myMethod(){ 
    var result = await funcAsync(); // here result is required before any other logic ahead 
    . 
    . 
    . 
} 

あなたは本当に近い将来、あなたのシステムが変更された場合は、待つが、何非同期を使用する必要はありません、あなたはの間に、あなたはメソッドのシグネチャを変更する必要があり、対応するかもしれない追加のコードを追加する必要がありますそのメソッドが呼び出される場所。

これは要件に完全に依存します。

1

本当にあなたの要件に応じて異なります。あなたは私はあなたが非同期呼び出しを必要としないが、それは最後の呼び出し_mongoCollection.Find(...).ToListAsync()

非同期呼び出し(私見)で便利になることが推測できる投稿したコードから

は、あなたが持っている場合にのみ使用する必要がありますいくつかの独立した/複雑なロジック。 ToListAsync()を待つ間

_mongoCollection.Insert(entity); 
_mongoCollection.Find(query).ToListAsync(); 

あなたは、単にいくつかの余分なロジックを行うことができますこの方法:

_mongoCollection.Insert(entity); 
Task<List<object>> _task = _mongoCollection.Find(query).ToListAsync(); 
// my complex logic/calculations and stuff 
await _task; 

は100%正直なIドンである例では、私はあなただけawait最後の呼び出しは、それを作ることができると思い示したこと非同期呼び出しを使用する他の理由がありません。

私の意見はあなたの例から、非同期呼び出しの使用は役に立たないということです。

1

私は以前の答えには非同期の大きな問題がないと思います。つまり、非同期メソッド**を使用すると、I/O処理が完了している間(ほとんどの)I/O処理が完了したスレッドを解放し、アプリ内の別の場所で使用できるようになります。例えば他の要求を処理する。

Mongoデータベースが別のサーバーにあるとしましょう。クイックネットワークと迅速なMongoのインスタンスでさえ、これはおそらくおそらくコマンド当たり5msです。これは2GHz CPUで1000万クロックサイクルです。さまざまなオーバーヘッドのためにコードを実行する上でそれらのすべてを使用するつもりはありませんが、の場合は、に追加のスレッドを生産的に使用できるアプリがあるとします。

アプリがウェブサイト、API、UIなどの場合は、非同期メソッドを使用します。シングルスレッドのコンソールアプリであれば、おそらく上記の利点は得られません。

-

**これはMongoの非同期メソッドを想定して、真に非同期であり、ちょうど同期メソッドのラッパーではありません。

関連する問題