私の意見では、これはデータベースにある種のフラグを立てることと、フラグを定期的にチェックしてジョブを開始するWindowsサービスによって解決する必要があります。ジョブの頻度が高すぎる場合は、専用のキューソリューション(MSMQ、RabbitMQなど)を使用して、データベースの過負荷やテーブルの急成長を回避する必要があります。メッセージがドロップされる可能性があるため、WCFなどを介してWindowsサービスと直接通信することはお勧めできません。
そうは言っても、プロジェクトを共有ホスティングで実行する必要があり、専用のWindowsサービスをセットアップできない場合があります。この場合、スレッドは回避策として受け入れられますが、プロジェクトが成長して独自のサーバーを持つようになったらすぐに削除する必要があります。
ASP.NETの他のすべてのスレッドは、タスクを使用して非同期操作を表す場合や、非常にまれなケースで、Webプロジェクトで並列に計算を実行したいが、プロジェクトに同時ユーザーがほとんどいない場合を除いて、問題の兆候だと思います。 (コアの数より少ない同時ユーザー)
タスクがASP.NETで役立つのはなぜですか?
非同期操作にタスクを使用する最初の理由は、.NET 4.5以降、非同期APIがタスクを返すことです:)非同期操作(並列計算と混同しないでください)は、Webサービス呼び出し、データベース呼び出しなどです。これらは2つのことに役立つ場合があります。 :
- それらのいくつかを一度に発射すると、あなたの仕事は最長の操作に等しい時間がかかります。シーケンシャル(非同期ではない)方法でそれらを起動すると、各操作の時間の合計に等しい時間がかかり、明らかにそれ以上になります。
- ページを実行しているスレッド(Node.jsスタイル)を解放することで、スケーラビリティを向上させることができます。ASP.NETはこれを永遠にサポートしていますが、バージョン4.5では非常に使いやすいです。async / awaitがあるので、Node.jsよりも簡単だと主張するところまで行きます。スレッドを解放することは重要です。なぜなら、スレッドを待機させることによって、プール内のスレッドを使い果たす可能性があるからです。その結果、新しいリクエストがキューで待機しているという理由だけでCPU使用率が30%程度であるにもかかわらず、特定の数のユーザーがいるとWebサイトが遅くなります。スレッドプール内のスレッドの数を増やすと、OSよりも一定のコンテキスト切り替えの代償を払うことになります。ある時点でCPU使用率は100%になりますが、その40%はコンテキストの切り替えに費やされます。スループットは向上しますが、収穫逓減が発生します。