1

私はASP.NETプロジェクトに取り組んでおり、昨日、System.Threading.Threadを使用していくつかのタスクを新しいスレッドにオフロードするコードを見つけました。スレッドはいくつかのSQLステートメントを実行し、結果をログに記録します。

別のアプローチを使用する方が良いのではないですか?たとえば、SQLバッチを実行するWindowsサービスがあるとします。次に、Webページは(WCFを介して)バッチをキューに入れるだけです。

一般に、ASP.NETでのマルチスレッドのベストプラクティスは何ですか?スレッド/TPLタスクなどの正当な使用法はありますか?Webページで?

4

2 に答える 2

2

ASP.NETでマルチスレッドを使用するときの私の考え:

  1. ASP.NETは、web.configを変更するなどの理由で、またはメモリリークを回避するために一定期間、AppDomainをリサイクルします。問題は、リサイクルの正確な時期がわからないことです。ASP.NETがリサイクルされると、それに応じてスレッドがダウンするため、長時間実行されるスレッドは適していません。この場合の正しいアプローチは、あなたが言及したように、長時間実行されるタスクがキューを介してバックグラウンドプロセスで実行されるべきであるということです。

  2. 短時間の実行と起動してタスクを忘れる場合は、TPLまたはasync / awaitが最適です。これは、HTTP要求に利用するスレッドプール内のスレッドをブロックしないためです。

于 2012-11-02T06:29:20.787 に答える
0

私の意見では、これはデータベースにある種のフラグを立てることと、フラグを定期的にチェックしてジョブを開始するWindowsサービスによって解決する必要があります。ジョブの頻度が高すぎる場合は、専用のキューソリューション(MSMQ、RabbitMQなど)を使用して、データベースの過負荷やテーブルの急成長を回避する必要があります。メッセージがドロップされる可能性があるため、WCFなどを介してWindowsサービスと直接通信することはお勧めできません。

そうは言っても、プロジェクトを共有ホスティングで実行する必要があり、専用のWindowsサービスをセットアップできない場合があります。この場合、スレッドは回避策として受け入れられますが、プロジェクトが成長して独自のサーバーを持つようになったらすぐに削除する必要があります。

ASP.NETの他のすべてのスレッドは、タスクを使用して非同期操作を表す場合や、非常にまれなケースで、Webプロジェクトで並列に計算を実行したいが、プロジェクトに同時ユーザーがほとんどいない場合を除いて、問題の兆候だと思います。 (コアの数より少ない同時ユーザー)

タスクがASP.NETで役立つのはなぜですか?

非同期操作にタスクを使用する最初の理由は、.NET 4.5以降、非同期APIがタスクを返すことです:)非同期操作(並列計算と混同しないでください)は、Webサービス呼び出し、データベース呼び出しなどです。これらは2つのことに役立つ場合があります。 :

  1. それらのいくつかを一度に発射すると、あなたの仕事は最長の操作に等しい時間がかかります。シーケンシャル(非同期ではない)方法でそれらを起動すると、各操作の時間の合計に等しい時間がかかり、明らかにそれ以上になります。
  2. ページを実行しているスレッド(Node.jsスタイル)を解放することで、スケーラビリティを向上させることができます。ASP.NETはこれを永遠にサポートしていますが、バージョン4.5では非常に使いやすいです。async / awaitがあるので、Node.jsよりも簡単だと主張するところまで行きます。スレッドを解放することは重要です。なぜなら、スレッドを待機させることによって、プール内のスレッドを使い果たす可能性があるからです。その結果、新しいリクエストがキューで待機しているという理由だけでCPU使用率が30%程度であるにもかかわらず、特定の数のユーザーがいるとWebサイトが遅くなります。スレッドプール内のスレッドの数を増やすと、OSよりも一定のコンテキスト切り替えの代償を払うことになります。ある時点でCPU使用率は100%になりますが、その40%はコンテキストの切り替えに費やされます。スループットは向上しますが、収穫逓減が発生します。
于 2012-11-01T20:39:32.507 に答える