2010-12-05 3 views
1

正確な時間にメソッドをコールバックするメソッドを実装したいと思います。我々は、同時に呼び出すことができる方法以上のものを持つことができます。時間付きコールバック

public void CallmeBack(DateTime time, Action callback) 
    { 

    } 

C#での最適な実装は何ですか?

速くて汚い解決策は、辞書Dictionary<DateTime, List<Action>>を作成し、毎分(分/秒)ごとにタイマーを作成し、テストモードで時間(DateTime.Now)と現在の時刻を確認することでした。

解決方法は、現在のマシン時間が変更された場合は「安全」である必要があります。そのため、このような単純な解決策は動作しませんでした:

 Timer timer = new Timer((param) => {callback.Invoke();}, null, 
      (long)(time - DateTime.Now).TotalMilliseconds, Timeout.Infinite); 

編集を:シンプルなタイマーが動作しない 典型的なケースは、DSTと手動時間/日付の調整です。 さらに、コールバックを複数回ではなく1回だけ実行したいだけです。

+0

私はそれが遅いと知っていますが、これを解決しましたか?どのくらい正確にこれが必要なのですか? –

答えて

2

お探しのものは、cronライブラリです。そこには多くの人がいます。いくつかは多くの機能を持ち、少し重いです。ここでは、私が実動コードで使ったcronジョブとライブラリに関するブログ記事があります。

http://blog.bobcravens.com/2009/10/an-event-based-cron-scheduled-job-in-c/

あなたが始めるのに役立ちます希望。

ボブ

+0

あなたの投稿をちょうど読み返してください。ライブラリをチェックし、最後の要件に注意してください。それはしばらくしており、私は内部を忘れてしまった。 – rcravens

+0

実際、時間の変化を考慮していないようです。私はそれを確認するコードを詳しく見ています。少なくとも、あなたは私を始めます;) – Zied

1

あなたは検討する必要があります選択肢のカップル:

  • 次のようなタスクスケジューラ使用することができます:あなたはタイマーを使い続けることができhttp://taskscheduler.codeplex.com/

  • をし、時間の変更を聴く:SystemEvents.TimeChanged。そのイベントはユーザーの時間変更によってトリガーされます。最初にタイマーを設定するときに、予測可能な時間の変更(夏時間など)を処理できると仮定します。私はNTPに関連する変更についてはわかりません。それをさらに調査する必要があります。

+0

私はタスクスケジューラが単に私の問題を解決することができないように処理しないメソッドを実行する必要があります。 – Zied

+0

イベントのために、私は最終的にそれを扱うことができます。 – Zied

関連する問題