2013-04-27 17 views
6

ASP.NET 3.5 Webアプリケーションは、完了に数時間かかるいくつかのタスクを開始する必要があります。明らかな理由から、これらのタスクを開始するページは、終了するのを待つことができず、誰も応答を得るまで待たずに済むので、タスクは非同期でなければなりません。ASP.NET長い実行タスク。スレッドが中断されている例外

これらの長期実行タスクをすべて処理するヘルパークラスがあります。およそ10mlの液体フッ化水素を圧入した後:私たちはThreadPool.QueueUserWorkItemアプローチを使用しましたが、結果は常に同じとなっている以前の実装で

public static bool ScheduleTask(TaskDescriptor task, Action action) 
{ 
    bool notAlreadyRunning = TasksAsync.TryAdd(task); 
    if (notAlreadyRunning) 
    { 
     Thread worker = null; 
     worker = new Thread(() => 
     { 
      try { action(); } 
      catch(Exception e) 
      { 
       Log.LogException(e, "Worker"); 
      } 
      TasksAsync.RemoveTask(task); 
      workers.Remove(worker); 
     }); 
     workers.Add(worker); 
     worker.Start(); 
    } 
    return notAlreadyRunning; 
} 

:これらのタスクを実行スケジュールと主な方法は、現在、次のようです。 20〜30分スレッドが中止されました例外がスローされました。

なぜこのようなことが起こっているのですか?どのように防止することができますか?

詳細:

  • は、標準的な構成をIIS。決定

    ご回答ありがとうございました:

  • タスクは、

UPDATEは、データベースおよび/またはIO操作などにquerys何でもかまいません。今私はどの質問を答えにするのか分かりません。それらのすべてが有効であり、この問題に対する可能な解決策です。今日を待って、最も高い票の回答に答えるとマークします。抽選の場合、最初に示された回答を選択します。通常は、最も関連性の高い順に並べられます。

IISのリサイクル構成を変更することで、私が選択した解決策を知りたいと思っている人は誰でも、私の研究ともちろん答えに基づいて理想的なソリューションと考えています「Worker Service」を作成し、ASP.NET Appと新しい「Worker Service」の間の通信ソリューションを使用して、実行される長期的な作業を調整することです。

+0

IIS AppPools/workersはリサイクルしていますか? –

+0

IIS設定はIIS 7の標準設定です。そうですね、私は推測します。 – Unlimited071

+0

私はASP.NETの中で掘り下げていたので、しばらくしていましたが、メモリが役立つと、ワーカープロセスがリサイクルするとスレッドを停止することができます。リサイクルを無効にして、それが糸流産の原因かどうかを確認してください。 (そうだとすれば回避策はわかりませんが、私が言ったように、特定の問題には触れていません) –

答えて

6

長期実行プロセスは、独自のアプリケーションドメインで開始できます。

これまで私がこの機能を必要としていたときに、この目的のためにWindowsサービスを作成しました。 WCFを使用して接続する場合は、IISマシン上で実行する必要はありません。ネットワーク上のどのマシンでも実行できます。

+0

私はあなたが正しいと思うし、それが取るアプローチだろうが、時間制限のために私はそれをすることができるとは思わない。 – Unlimited071

+0

あなたは本当に選択肢がないと思います。 Phil Haackは、IISがこれを行うように設計されていないことを明確にしています。あなたは、新しいappdomainのスレッドをスピンアップすることができます:http://www.pcreview.co.uk/forums/start-thread-new-appdomain-t3614317.html –

+0

私はあなたがその場でappdomainを作成できるかどうかはわかりませんでしたそのように...私はそれについて読むと思います。しかし、あなたが私に少しの研究を救うことができるなら、スレッドが終了したときにappdomainはどうなりますか?基本的にどうすれば新しいappdomainのリソースを解放することができますか? – Unlimited071

3

フィール・ハアックは、彼のThe Dangers of Implementing Recurring Background Tasks In ASP.NETポストで被験者を深く掘り下げています。これは役に立ちます。

+0

素晴らしい投稿、共有ありがとう!時間制限のために私はappdomainのアプローチをすることはできないと思う。 – Unlimited071

+0

Philのポストは素晴らしい一日だったが、少なくとも今はWAWSでは時代遅れだ。 Azure WebJobを使用できるようになりました。 – RickAndMSFT

4

異なるアプリケーションプールやその他のさまざまなハッキングを使用してタイムアウトを上げることで、この作業を行うことができますが、最善の策は、uiから長時間実行するタスクを切り離すことですasp.netを完全に実行し、サービス(それをお勧めしません)または作業を行うために投票するスケジュールされたタスクを使用してください。個人的には、aws sqs/snsのようなものを使用して、実行する作業を追跡し、スケジュールされたタスクをWindowsサーバーで実行して、どんな頻度でもtodoをチェックします。 ui/asp.netが行う必要があるのは、何かを行う必要があるという事実を記録することだけであり、実際には行わないことです。

このメッセージベースのアプローチのもう1つの利点は、長時間実行されるプロセスが長時間実行されるか、あまりにも多くなると、それらの要求を完了するためのワーカータスクまたはサーバーを追加する機会が得られることです。

あなたの直面する問題のために実装できる以上のものがありますが、より長期的な解決策として検討する必要があります。

関連する問題