3

これら 2 つのアクション メソッドの違いは何ですか?

public ActionResult Index()
{
    var task = new ServiceClient().GetProductsAsync();

    return View(task.Result);
}

public async Task<ActionResult> Index()
{
    var task = new ServiceClient().GetProductsAsync();

    return View(await task);
}
4

2 に答える 2

6

最初のものは、データベースから結果を取得するまで、ASP.Net 要求スレッドをブロックします。

2 つ目は ASP.Net スレッドをすぐに解放し、結果が返ってきたら別のスレッドを取得します。

したがって、2 番目の方がスケーラブルです。

この回答は、呼び出している非同期のチェーンが正しく記述されており、実際の非同期ソケット操作で終了していることを前提としていることに注意してください。

于 2013-01-06T02:36:37.010 に答える
2

最初のものは、タスクが完了するまで ASP.NET 要求スレッドをブロックします。
2 番目はスレッドをすぐに解放し、タスクが完了したら別のスレッドを取得します。

利点は何ですか?

スレッドは、実際にはかなりコストのかかるリソースです。OS リソースを消費し、スレッドには、メソッドに到達する前に呼び出されたすべてのメソッドのすべての変数を含むスタックがあります。サーバーが 100 スレッドを処理できるほど十分に強力であるとしましょう。100 件のリクエストを処理できます。各リクエストを処理するのに 100 ミリ秒かかるとしましょう。これにより、1 秒あたり 1000 件のリクエストが得られます。

GetProductAsync() の呼び出しに、これらの 100 ミリ秒のうち 90 ミリ秒かかることが判明したとします。データベースまたはサービスがほとんどの時間を占めることは珍しくありません。これらの呼び出しを非同期にするということは、各スレッドが 10 ミリ秒だけ必要になるということです。突然、同じサーバーで 1 秒あたり 10000 のリクエストをサポートできるようになります。

したがって、「非同期コントローラーの利点」は、1 秒あたりのリクエスト数が 10 倍になる可能性があります。

もちろん、すべてはバックエンドのスケーラビリティにも依存しますが、.NET が面倒な作業をすべて行ってくれるのに、なぜボトルネックが発生するのでしょうか。非同期処理だけではありません。いつものように、悪魔は細部に宿ります。http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspxなど、役立つリソースがたくさんあります。

于 2013-01-06T02:54:42.150 に答える