2016-07-20 12 views
3

私は〜50の定期的なジョブを持つハングファイアサーバーを1台持っています。 IIS上のHangfireの設定はthis exampleです。 経常ジョブは、このようなstartup.csでhangfireに追加:1つのジョブを同時に実行するには?

RecurringJob.AddOrUpdate(job.desctiprion, 
      () => job.startJob(), 
      job.cron, 
      TimeZoneInfo.Local); 

私は毎分を実行している新しい定期的なジョブを追加する必要があります。しかし、この仕事がより長く続くことはほとんどありません。私の目標 - この仕事の一つの標本だけを同時に働かせるようにする。

どのような解決策がありますか?理解しているように、1つのスレッドで待ち行列のようなものが必要ですが、待ち行列はスレッド設定をサポートしていません。

+0

それは、あなたが何をしようとしては明らかではありません「だけで1」と '同時に本当に一緒に行くしていないようです。これは:*この仕事の一つの標本だけを同時に働かせるようにする*意味がない。明確にすることはできますか? –

+0

このジョブが自分自身と重複しないようにしたいのですか? – DavidG

+0

処理中のこの定期的なジョブの1つ以上のインスタンスがあるときは、状況を避ける必要があります。はい、私はこの仕事がそれ自身と重複しないようにしたいだけです。 たとえば、最初のジョブは17:00に実行され、この実行には2分30秒かかります。私は17時01分と17時02分にジョブを実行する必要はありませんが、17時03分にジョブを実行します。 私は、ジョブが現在実行中であるかどうかを検証するために、データベースにフラグを使用できることを理解します。しかし、たぶんHangfireには、このケースに対する単純で正確な解決策があります。 – sintasy

答えて

5

DisableConcurrentExecutionフィルタを使用すると、同時実行を防ぐことができます。

[DisableConcurrentExecution(timeoutInSeconds: 60)] 
public void SomeJob() 
{ 
    //method body 
} 

それは IServerFilterインタフェースを使用して完了した後にこのフィルタは、それをする方法 パフォーマンスの初めに分散ロックを配置してのリリース。タイプとメソッド名はロックリソース として使用されています。各ストレージは独自の分散ロック 実装を使用します。 (read more here

+2

ありがとうございます、あなたは答えは非常に有用です。 再試行で大量のジョブが発生しないようにするには、[AutomaticRetry(Attempts = 0)]も使用できます。 – sintasy

-1
var worker = new BackgroundWorker(); 
worker.DoWork += worker_DoWork; 
worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
     // do your task here 
} 
private void worker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) 
{ 

     //Do when completed 
} 
+0

あなたはバックグラウンドワーカーを使用することができます –

+1

あなたの答えは、OPが求めているものから逸脱しています。彼はバックグラウンドジョブ処理にハングファイアを使用しています。この目的のために 'BackgroundWorked'を使うことはまったく違うことです。 – Yogi

関連する問題