2009-05-22 8 views
0

ランダム(ish)間隔でタスクを実行するバッチジョブをC#で作成したいとします。 +/- 20分ごとに更新が必要ない場合は、最後にx2を実行してからもう一度実行してください。ランダムな間隔でスクリプトを実行する方法

これを行うにはどのような方法が最適ですか?

答えて

0

単純なアプリケーションを作成し、Windowsタスクスケジューラを使用してアプリケーションを起動することを検討してください。スケジューラは、いつ、何が実行されるかを制御し、時間のランダム化を含みます。

EDIT: '2x'部分を忘れました。過去には、私はこれを行うには、Windowsサービスを構築しました:

sleep(1x +/- random(20 minutes)) 
if nothing to do, sleep(2x +/- random(20 minutes)) 
0

だけしょっちゅうポップやメソッドを実行し、タイマーを作成することができます。

例:

Timer ProcessTimer = new Timer(new TimerCallback(ProcessRandomTask), null, 0,Timeout.Infinite); 


private void ProcessRandomTask(object data) 
{ 
//Do work 

    lock(ProcessTime) 
    { 
     //change timer 
     ProcessTimer.Change(GetNewTime(), Timeout.Infinite); 
    } 
} 
1

皆の答えはかなり良いですが、私はここに寄与することができる唯一のことは、あなたがやるべきではない何かです。 ではないアプリケーションをWindowsサービスにします。私はそれを何度も同じような問題に対する答えとして見てきました。それはWindowsサービスのためのものではありません。

私の本では、Windowsサービスは、他のプログラムを容易にするためにバックグラウンドでハングアップするアプリケーション/プログラムであり、ユーザーの操作を必要としません。これは、時間間隔でプログラムを起動する方法として使用することはできません。

+0

これは、必要な場合を除き、サービスではないはずです。サービスは、ユーザーがログアウトしている、またはマシンが再起動されていても、何かを常に実行するための素晴らしい方法です。彼はそれがほしいと思うように聞こえる。 –

+0

それが彼が望む機能ならば、彼は私の答えをすべて無視するでしょう。しかし、それは私が公に傷つけたかっただけのかゆみです。 –

+0

私はそれがスクリーンに進展するのを見てうれしく思います。したがって、サービスを書くことは避けます。 – Pbearne

0

最後の「不要な」実行からデータベース/一部の永続的な場所にタイムスタンプを記録するのはどうですか?次に、最初の行は次のようになります。

LastRunWithoutUpdating = GetLastRunWithoutUpdating() // load from file, or db... 
if (LastRunWithoutUpdating - CurrentTime < DelayInterval) { 
    SkipThisRun(); // sys.exit() or something 
} 
+0

がdbを使用しないようにしようとしていた – Pbearne

+0

あなたのプログラムがスケジューラにアクセスできない場合は、何らかの永続的な記憶域を持たなければならないか、プロセスが独自のスケジューリング(すなわち、スリープ状態)とSleep()ですから、「最後の更新」の値をファイルに書き込む方法はありますか? – ojrac

+0

可能な他の値が2つあります。 – Pbearne

関連する問題