2016-08-29 1 views
1

asp.netアプリケーションからバックグラウンドで実行中のスレッドが必要です。 ところで、メソッドは外部データソース期間から何かを取得し、例外が発生する可能性があります。私はこのタスクをフルフィルするいくつかの方法を提供しています。私はスレッドを永遠に実行し続ける必要があります。どちらの方法が最適ですか?

Way1 =例外が発生したときのループ。

static void LongRunningMethod() 
    { 
     do 
     { 
      try 
      { 
      //fetch something from external period and maybe exception happens. 
      Thread.sleep(100000); 
      } 
      catch(Exception ex) 
      { 
       //log exception.. 
      } 
     } while (true); 
    } 

ウェイ2 =タイマーのようなもので、次の方法期間を実行すると、例外が発生したときに、新しいスレッドを開きます。

static void LongRunningMethod() 
    { 

      try 
      { 
      //fetch something from external period and maybe exception happens. 
      Thread.sleep(100000); 
      } 
      catch(Exception ex) 
      { 
       //log exception.. 
      Thread T2 = new Thread(LongRunningMethod); 
      T2.Start(); 
      } 

    } 

Way3 =例外が発生したときにそれ自身を呼び出します。 - 奇妙な間隔のため申し訳ありません - 私は、コードウィンドウでこれを直接編集し

static BackgroundWorker looper = new BackgroundWorker(); 
static bool isRunning = true;//you can set this to false when closing 
public static void initialize(){ 
    looper.DoWork+= doLoop; 
    looper.RunRunWorkerAsync(); 
    } 
    private static void doLoop(object sender, DoWorkEventArgs e){ 
     while(isRunning){ 
      //do looping code 
      System.Threading.Thread.Sleep(5000); 
       if(!isRunning) 
        break; 
     } 
    } 

PS:

static void LongRunningMethod() 
    { 

      try 
      { 
      //fetch something from external period and maybe exception happens. 
      Thread.sleep(100000); 
      } 
      catch(Exception ex) 
      { 
       //log exception.. 
       LongRunningMethod(); 
      } 

    } 
+0

タスクを実行するには、Async-AwaitまたはBackGroundWorker、またはその両方を使用する必要があります。あなたはそれについてもっと知るために両方の用語をGoogleに入れることができます。 –

+0

電気代を請求し、コンピュータの電源コードを抜かないでください。 – siride

+0

Ways 2&3では、最終的にスタックのオーバーフローが発生します。 – SledgeHammer

答えて

1

私は3つのうちどれも使用しません。実際に、私はほとんどASP.NETの間隔タスクの基盤を構築しない理由:

1.タスクの開始は制御不能である

ASP.NETに基づいて、タスクは上の登録/起動する必要がありますApplication_Startメソッドは、最初のリクエストによってトリガされます。つまり、最初のリクエストが来たときにタスクが開始されます。理論的には、アプリケーションのデプロイ後に時間がかかることがあります。

2.タスクの終了は、(私の知る限り、これがデフォルトの動作です)リサイクル・オン・デマンドとして構成することができる制御

のWebサーバー(IIS思考)の外にあります。つまり、実行時にスレッドが強制終了される可能性があります。ほとんどの状況下では、あなたのタスクと状態の永続性に対処し、コードの再試行などを追加する必要があります...それは悪夢です!

WindowsサービスやWindowsのタスクスケジューラ機能を使用する方が良いでしょう。後者は、タイマーやインターバルコールコードを書く必要がないため、さらに簡単です。イベントビューアでは、より安定し、コードが少なく、フレンドリーなログです!それは本当にすべてを簡単にしています。

+0

はい、ジョブ、Windowsサービス、またはWindowsのタスクスケジューラ機能で実行する方が良いですが、asp.netで実行することが必須です。第2の懸念は、http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx – Jason

+0

@Jason - soによって修正することができますあなたはそのブログを読んできましたが、あなたはまだこの危険なことをやりたいのですか?なぜasp.netアプリケーションを定期的に呼び出すWindowsサービスやスケジュールされたタスクを実行しないのですか? –

+0

@Erik Funkenbusch、私たちは保守のために別のアプリケーションを構築したくないからです。 – Jason

0

私はSystem.ComponentModel.BackgroundWorkerを使用したいです。

+0

コードをループするときに例外が発生するのはどうですか?また、BackgroundWorkerはwinform withUIの方が適しているようですが、asp.netのバックグラウンドスレッドとして実行してデータベースからデータを取り出し、キャッシュに更新する必要があります。UIはありません。 – Jason

+0

BackgroundWorkerにはUIは必要ありません。あなたはtry [] catch []で他のメソッドのように例外を処理します。シンプルなループではなく、BWを使用する利点は、ステータス情報などが組み込まれていることです。必要に応じてキャンセルしたり、ステータスを確認したり、スレッドがバックグラウンド操作に最適化されたりするのは簡単です。 –

+0

常に猫を肌に触れる方法は複数あります。私は多くを提供しています。ここではパフォーマンスは問題ではありません。 @Danny以外のすべてのメソッドはループを処理します。 SOを生成するものを除いて、いずれかの間の相違は最高で控えめです。 –

関連する問題