13

私は .NET 4 を使用して Web サイトを構築しています。2003 年からのThread オブジェクトの使用に関する MSDN 記事や.NET 2 での非同期ページの使用に関する 2007 年の記事がたくさんありますが、それはすべてかなり古いものです。.NET 4 でTask クラスが導入されたことは知っていますが、一部の人々は、この目的での使用に対して漠然と警告を発しています

ASP.NET 4 で IIS の下でバックグラウンド/非同期作業を実行するための 2011 年頃の「推奨」方法は何ですか? Thread/Task を直接使用する場合の注意点は何ですか? Async=true はまだ流行していますか?

編集:わかりました、わかりました、回答から、可能であればサービスを作成する必要があるという意見は明らかです。しかし、webapp 内で行うことの利点は大きく、特に展開/再展開が簡単です。プロセスがクラッシュしても安全であると仮定すると、IIS 内でそれを行う場合、最善の方法は何ですか?

4

6 に答える 6

18

優先的に、そのような環境で長いタスクを実行することは避けてください。

相互運用性を介して長時間実行されるタスクを安定したシステム サービスに委任し、Web アプリケーションを応答性の高いままにして、直接のユーザー リクエストにのみ必要とします。

Web アプリケーションは信頼できるシステムと見なされたことはありません (そして今もそうではありません)。ブラウザーを使用したことがある人なら誰でも (少なくとも) タイムアウトに遭遇したことがあります。このような (両当事者にとっての) 不都合は、このシナリオに限定されません。もちろん、どのシステムでもクラッシュする可能性はありますが、永続的に構築されたシステムでこのようなイベントが発生した場合は、完全に例外的な状況になるはずです。

Windows サービスは長時間動作するように設計されており、何か問題が発生した場合は、通常、個々のサービスよりも心配する必要があります。

于 2011-04-05T13:58:10.087 に答える
2

避けるのが最善ですが、やむを得ない場合は、 How to run Background Tasks in ASP.NETで Hanselman の考えを検討してください。

その中で、手っ取り早く簡単なものとして、特に 4.5.2 で追加されたQueueBackgroundWorkItemを確認することをお勧めします。

個人的な経験から、Task はそれをカットしません。QueueBackgroundWorkItem ははるかに優れています。

于 2015-11-12T23:55:59.443 に答える
0

このhttp://www.dotnetperls.com/threadpoolのように、制限されたスレッド数 (たとえば 2 つだけ) で静的 ThreadPool を作成できます。その中にタスクをキューに入れますが、ウェブサーバーはそのような種類のタスク用ではないため、強くお勧めしません

于 2011-04-05T14:02:27.790 に答える
0

私の好みの方法は、Robert Harvey が回答で提案しているものと同じです。

Task Parallel Libraryは引き続き使用できますが、IIS の外部の別のプロセスでタスクをスピンアップできます (IIS には配布するワーカー スレッドの数が制限されており、長時間実行されるタスクを予測不可能にする可能性のある他の制限があるためです)。

于 2011-04-05T13:59:01.697 に答える
0

これは、「1 日 1 回」のシナリオの説明です。

本当にサービスの作成を避けたい場合は、1 分間隔でタイマーを開始できます。タイマー デリゲートが呼び出されるたびに、次のようなコード (疑似コード) を実行する必要があります。

lastInvokeDay = LoadLastInvokeDate();
If (lastInvokeDay < DateTime.Now.Date && timeOfDayToRun == DateTime.Now.Time)
{
  try
  {
    today = DateTime.Now.Date;
    runMyTask();
  }
  catch..
  finally
  {
    lastInvokeDay = today;
    SaveLastInvokeDay(lastInvokeDay);
  }
}

lastInvokeDay は、データベースまたはファイルに永続化する必要があることに注意してください...

ここで、タスクの即時呼び出しを有効にしたい場合は、単にrunMyTask()オンデマンドで呼び出すことができます。runMyTask が 1 日に複数回発生しないようにすることが重要な場合は、その中に (ステートメントを使用して) 同期化されたコード ブロックを作成し、その中にチェックlockを移動することができます。lastInvokeDay

これはあなたの質問に答えていますか?

于 2013-07-02T08:13:59.847 に答える