2017-06-16 3 views
0

WebAPIマイクロサービスを作成していて、asyncを使用する利点があるかどうか疑問に思っています。このサービスは、Entity Frameworkを使用してSQLデータベースを呼び出します。シングルスレッドアプリケーション用の非同期の利点

同期:

using(var db = new Entities()) 
{ 
    var user = db.Users.FirstOrDefault(); 
    user.IsActive = false; 
    db.SaveChanges(); 
} 

非同期:

using(var db = new Entities()) 
{ 
    var user = await db.Users.FirstOrDefaultAsync(); 
    user.IsActive = false; 
    await db.SaveChangesAsync(); 
} 

私が見てきたasyncのいくつかのユースケースとは異なり、awaitableサブタスクとキックオフの間で行わ何も処理はありませんawait(これはおそらく文字通りではないが「シングルスレッド」)からのサスペンションです。

質問はです。リソースの観点から見ると、これは同期代替とどう違うのですか?それがコントローラ全体を通して非同期であると仮定すると、サービスの拡張性は向上するでしょうか?

ボーナスポイント:他の非同期アプリケーションで同期ブロッキングを実行した場合の影響(たとえば、開発者が非同期メソッドを使用することを忘れた場合)

+0

「非同期」とはどういう意味ですか? –

+0

結果の代わりにタスクを返す。 「コントローラ全体を通して」とは、タスクが.Resultまたは.Wait()で呼び出されないことを意味します。 –

答えて

2

私のintro to async on ASP.NETの記事、特に前半を読むことをお勧めします。

私の質問は、リソースの観点から見ると、これは同期代替とどのように本当に違いますか?

同期バージョンは、SQLクエリと更新がすべて完了するまでWebサーバーのスレッドをブロックします。非同期バージョンは、SQLクエリと更新が進行中のときにWebサーバーのスレッドを消費しません。スレッドが少なくなるということは、Webサービスが他のことをより簡単に実行できることを意味します。

コントローラー全体が非同期であると仮定すると、サービスの規模は改善されますか?

ウェブサービスはありますか?はい。あなたのサービス全体?場合によります;具体的には、バックエンドの規模に応じて異なります。単一のSQLサーバーバックエンドであれば、SQLサーバーがボトルネックになるため、Webサーバーの規模を拡大することはできません(おそらく)。 SQLクラスタまたはAzure SQLの場合、asyncを使用すると(おそらく)、システム全体にとって有益なものになります。

ボーナスポイント:他の非同期アプリケーション(例えば、非同期メソッドの使用を忘れた場合)で同期ブロッキングを行うことの意義は何ですか?

この操作のためにスレッドが消費されます。たとえば、非同期バージョンでFirstOrDefaultAsyncSaveChangesSaveChangesAsyncではない)を使用すると、クエリ中にスレッドは解放されますが、保存中はブロックされます。

関連する問題