ASP.NET MVC には、ユーザーが入力した電子メール アドレスのリストを受け取り、それらを検証してから、HTML およびテキスト バージョンの電子メール メッセージを各受信者に送信するアクションがあります。その後、ユーザーは感謝のページにリダイレクトされます。すべての電子メール メッセージが送信されるまで感謝ページへのリダイレクトを待機する必要がないため、Task.Factory.StartNew メソッドを使用して、実際に電子メール メッセージを送信する新しいタスクを開始し、正常に動作します。ユーザーはすぐにサンクス ページにリダイレクトされ、電子メール メッセージは別のスレッドで送信されます。したがって、すべてが思い通りに機能しますが、それでもマルチスレッドに関して次の質問があります。ここ数日、かなりの数の投稿を読みましたが、まだすべての回答が得られていません。
タスク ライブラリはスレッド プールのスレッドを使用します
タスク ライブラリを使用している場合は、ASP.NET スレッド プールのスレッドを使用して新しいスレッドを作成しています。つまり、アプリケーションの他の ASP.NET 要求を処理するために使用できるスレッドが 1 つ少なくなります。したがって、タスク ライブラリを使用しても、タスクを他の OS スレッドにオフロードして ASP.NET スレッドの使用を最適化することはできません。ユーザー エクスペリエンスのみが向上しますが、タスク ライブラリは、他の ASP.NET 要求を処理するために使用できる別のスレッドを使用します。したがって、唯一の結果は、ユーザーが待つ必要がないことです。
手ねじ
本当に OS スレッドを使用したい場合は、新しいスレッドを明示的に開始する必要があります。ただし、新しい OS スレッドを開始したとしても、アプリケーションのスケーラビリティの向上を実際に確認するには、複数のコアまたはプロセッサを搭載したマシンが必要です。
バックグラウンド スレッド プール
一部の投稿では、ASP.NET スレッド プールと、バックグラウンド タスクに使用される別のアプリケーションのバックグラウンド スレッド プールについて説明しています。つまり、各 ASP.NET アプリケーションには、アプリケーション要求を処理するための 1 つのスレッド プールと、バックグラウンド タスクを処理するための別のスレッド プールがあります。私はそれが真実ではないと思います。各 ASP.NET アプリケーションにはスレッド プールが 1 つしかなく、このプールのスレッドは、アプリケーション要求とバックグラウンド タスクの両方を処理するために使用されると思います。これは、通常 1 つのスレッド (UI スレッド) しか実行されておらず、明示的に新しいスレッドを開始する必要がある Windows フォーム アプリケーションについて言えることです。しかし、ASP.NET は基本的にマルチスレッドです。
質問は次のとおりです。
Dino Esposito による ASP.NET MVC 2 のプログラミングで非同期 MVC コントローラーについて読みました。彼は、非同期コントローラーが長時間実行されるタスクに OS スレッドを使用する方法について書いています。したがって、最初に ASP.NET 要求を処理した ASP.NET スレッドは、他の要求を処理するために解放されます。
ここでは非同期コントローラーは必要ありませんが、私の質問は、私の例でそのような OS スレッドをどのように使用できるかです。別のスレッドを明示的に開始する必要がありますか、それとも Task ライブラリで何とか可能ですか?
そのようなタスクを一部の OS スレッドにオフロードしたとしても、マシンにプロセッサが 1 つしかない場合、何かメリットがありますか? アプリケーションのスケーラビリティを本当に向上させるには、マルチコア マシンが必要だと思います。