どのようにイベントをトリガで03:00毎晩?
-
18-09-2019 - |
質問
どのようにこわんの紹介を読み読むぞ-!欲しいアプリの走行をサーバーはイベントをトリガは毎夜03:00になります。
解決
使用Windowsのタスクスケジューラ
他のヒント
あなたはアプリのコードを実行している(代わりのタスクスケジューラを使用して)でこれを実行したい場合は、かなり長い(例えば、1時間、または3600秒)ですアプリの睡眠を聞かせする時間を選択する必要があります。アプリはループ、および各睡眠コールの期限が切れると、アプリは定期的に締切時間(午前三時)まで残っているどのくらいの時間をチェックします。残り睡眠時間が粗い間隔時間未満になると、それは短い間隔(毎回半分、または10秒に低減)に低減されなければなりません。ターゲット締切時間に達するまで、寝て、インターバル時間を短縮、ループを続行します。
このは(86,400 1秒間隔が過剰である)あまりにも頻繁に目覚めてからループを防止しますが、それはあまりにも長い間眠って目標期限時間をオーバーシュートからアプリループを防止します。
あなたは1秒の間隔でタイマーを作ることができ、タイマーがオフになるとき、それは3時00だかどうかを確認します。
あなたは、それは誰もがない場合でも、マシンにログインして、トリガが発生することを確実にするためにさまざまな方法がたくさんある実行されることを確実にするために、サービスにそれを構築する必要があります。
System.Timers.Timer
がInterval
と次の3時との間の差に設定されているDateTime.Now
を行うことを検討してください。
またオプションです。
だいこの内の既存のサービスをお使いいただけますので タイマー トリガーの自分自身3:00毎晩、お客様の"タスク".
もっとも、これらは通常、より良い取り扱いによ Windowsのタスクスケジューラ.ではなく、応用生24/7、あなただけのスケジュールを走り回毎日3:00になります。
編集:
が必要な場合は、タスクスケジューラーからのコードともコメント)も可能です。タスクスケジューラの提供 API 設定には個々のタスク(ITask のタスクスケジューラ(ITaskScheduler).
しかし、だんにXP Embedded、あばを通常のシステム構成能力、課題実行われます。組み込みシステムにおいては、広い分野での制御中は展開ではないかと思います。
ここでは、テーブルを見て、タイマーを60秒ごとに実行される書いたサービスの簡易版です...あなたは時間を確認し、それを実行するためにタイマー経過イベントを変更することができます:
Dim Timer As System.Timers.Timer
Protected Overrides Sub OnStart(ByVal args() As String)
Timer = New System.Timers.Timer(60000)
AddHandler Timer.Elapsed, AddressOf timer_Elapsed
Timer.Start()
End Sub
Protected Overrides Sub OnStop()
Timer2.Stop()
End Sub
Private Sub timer_Elapsed(ByVal pSender As Object, ByVal pargs As System.Timers.ElapsedEventArgs)
'Ensure the tick happens in the middle of the minute
If DateTime.Now.Second < 25 Then
Timer.Interval = 65000
ElseIf DateTime.Now.Second > 35 Then
Timer.Interval = 55000
ElseIf DateTime.Now.Second >= 25 And DateTime.Now.Second <= 35 Then
Timer.Interval = 60000
End If
'Logic goes here
End Sub
あなたは、他のみんなのようにタスクスケジューラを使用することができる場合は、もちろん、ここで述べています。これは、これを行うための好ましい方法です。私はちょうどので、私はそれはあなたに役立つことができた場合にそれを投稿しようと思いました周りの敷設、このコードを持つことが起こりました。外部ソースがテーブルを編集しようとしていたとき、私たちは知っていたことはありませんので、また、このコードは私たちのために働きました。ミリ秒単位の正確な数に間隔を設定するとのmd5sumで指摘したように、これを行うためのはるかに効率的な方法になります。
この答えは少し左のフィールドであるかもしれないが、我々は多くの場合は、 CruiseControl.NET の使用します私たちのスケジュールされたタスクの一部。これは、それらすべてのために完璧ではないのですが、それはあなたが毎晩実行したい大きな仕事だし、他のコード/成果はそれに依存するならば、それは良い選択です。それが働いていた場合は、いつでも実行するようにスケジュールすることができ、電子メールは/失敗します。それがうまくいかなかった場合は、開始する前に必要なファイルをクリーンアップした後、他のスクリプト/コードを実行します。
必ずしもすべての状況に最適なソリューションが、それはそれを求めるものについて気に強力です。私たちは、ビッグデータ処理のジョブのいくつかのためにそれを使用し、それが働いた/失敗し、それが最初に失敗した場合でも、30分後に再試行されます場合は、すべてのEメールでのお問い合わせを送信します。それはあなたに素敵なファジーな感じを与える:)
(klausbyskovにより示唆されるように)、WindowsのタスクスケジューラまたはSQL Serverジョブます。
EDITます:
それとも、dyanically割り当てられた時間をしたい場合、あなたは10分ごとにそのポーリングするWindowsサービスを作成し、希望の時間(秒)で、いくつかのアクションを実行することができます。
C#のの中でWindowsサーバーを作成することは、かなり簡単ですし、これを行うことができます。ちょうどあなたがセキュリティを持っているし、ロギングが、それは(またはしないで)実行中に何が起こっているのか教えてはかなり難しいことができますので、考え出したことを確認します。
System.Threading.Timer して使用してください。
私はスケジュールされたタスクを実行するASP.NETアプリケーションでスレッドを生成しています。
それはあなたに利用できる持っているものに依存します。
あなたの最善の策は、Linux / Unixの上にある場合は、のcron の仕事を使用することです/ MacのOS X、Windows上でタスクスケジューラ、またはMac OS Xの新しいバージョンにのlaunchdするます。
あなたがアプリケーション内からこれをしたい場合は、、あなたはそれが三時であればイベントオフ、定期的及び火災に時間をチェックループが必要になりますが、これは理想的ではありません。
プログラムは、コマンドラインから実行することができますか?もしそうなら、foo.batファイルを作成し、(非常にシンプルな)あなたのプログラムのコマンドラインを呼び出します。
次にタスクスケジューラは、毎日午前3時に.batファイルを実行するためにを使用しています。