私はAsp Net Web APIを使用するAsp Net MVCクライアントを開発しています。そして私は自分のアプリケーションをより良く設計する方法を決めなければなりません。 Webをしばらく検索した後、MVCアクションメソッドを非同期にすることを提案する人々(例えば、here)が見つかりました。また、非同期アクションメソッドを使用する主な利点は、サーバーのスケーラビリティ、つまりサーバーがより多くの要求に対応できることです。しかし、私が消費しているWeb APIには同期アクションメソッドがあり、同じサーバー上で実行されます。だから、私の推測では、私のMVCのアクションメソッドが非同期であっても、サーバーが最終的には「MVCの観点から」拡大することができるため、私のMVCの非同期アクションメソッドを実装するメリットはありません。それでも同期Web APIのメソッドを消費するため、サーバーはスレッドプールから「必然的に」実行されます。たぶん私は何かが欠けているか、非同期アクションメソッドのいくつかの他の利点がありますか?ここで同期アクションメソッドを使用してAsp Net Web APIを使用するAsp Net MVCアプリケーションで非同期アクションメソッドを使用する利点はありますか?
は、私はあなたがよりよい私の問題を理解するために書いた非常に簡単なサンプルコードです:
これは、Web APIコントローラです:
public class UsersController : ApiController
{
private readonly IUserService _userService;
public UsersController(IUserService userService)
{
_userService = userService;
}
// As you can see this method is not asynchronous
public User Get(int id)
{
return _userService.GetUserById(id);
}
// some other code
}
これは、MVCコントローラで、私はどのように2つの選択肢があります私のアクションメソッド設計する:
public class UsersController : Controller
{
// A) Make simple synchronous action methods
public ActionResult UserPageSync()
{
IUserWebServiceSync userWebServiceSync = new UserWebServiceSync();
User user = userWebServiceSync.GetUserById(1);
return View();
}
// B) Make asynchronous action methods
public async Task<ActionResult> UserPageAsync()
{
IUserWebServiceAsync userWebServiceAsync = new UserWebServiceAsync();
User user = await userWebServiceAsync.GetUserByIdAsync(1);
return View();
}
}
非同期と同期のメソッドがあれば問題ありません。心配する前に、アプリケーションのパフォーマンスに問題が生じるまで待つことにします。非同期メソッドがたくさんあるということは、たとえば、アプリケーションがデータベースにアクセスして情報を取得するときに、メソッドが同期している場合よりも迅速にデータベースに要求を送信することを意味します。これは、実際のアプリケーションではなく、データソースをボトルネックにすることを意味します。どうすれば問題が発生した場合にアプリケーションをプロファイリングし、ケースごとに最適な方法を決定することをお勧めします。 – Luke
@ルークあなたは、メソッドが非同期の場合、Web APIが2回以上MVCアクションメソッドで呼び出された場合、要求がより速く送信されることを意味していますか?そして、今のところ非同期にするか、同期させる方がよいとお考えですか? –
私はWebAPIが何かを混乱させるかもしれないと思います。あなたはアクションメソッドからWebAPIを呼び出さないでしょう。あなたのWebページはJavascript経由でWebAPIを呼び出すかもしれません。はい、WebAPIメソッドが非同期データベース呼び出しを含む呼び出しスタックのすべての方法で非同期として定義されている場合、このメソッドが2回連続して呼び出されると、UIバインドされたスレッドは他の呼び出し元によって使用できるように解放されます理論的には、データベースへの呼び出しはスレッドの不足によってブロックされる可能性が低くなり、負荷に応じてより迅速にデータベースにヒットします。 – Luke