タイマーを実装するための最良の方法は何ですか?コードサンプルは素晴らしいでしょう。この質問では、「最善」とは、最も信頼性が高く(最小失火数)、正確であると定義されます。 15秒の間隔を指定した場合、10 - 20秒ごとではなく、15秒ごとにターゲットメソッドが呼び出されるようにします。一方、ナノ秒の精度は必要ありません。この例では、メソッドが14.51 - 15.49秒ごとに起動することが許容されます。
Timer
クラスを使用してください。
https://msdn.Microsoft.com/ja-jp/library/system.timers.timer(v=vs.110).aspx
public static void Main()
{
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval=5000;
aTimer.Enabled=true;
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}
// Specify what you want to happen when the Elapsed event is raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("Hello World!");
}
Elapsed
イベントは、TimerオブジェクトのInterval
プロパティで指定されたX分のミリ秒ごとに発生します。指定したEvent Handler
メソッドが呼び出されます。上の例ではOnTimedEvent
です。
System.Windows.Forms.Timer
クラスを使用することによって、あなたはあなたが必要なものを達成することができます。
System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
t.Interval = 15000; // specify interval time as you want
t.Tick += new EventHandler(timer_Tick);
t.Start();
void timer_Tick(object sender, EventArgs e)
{
//Call method
}
Stop()メソッドを使うことでタイマーを止めることができます。
t.Stop();
明確ではありませんどの種類のアプリケーションを開発しようとしている(デスクトップ、ウェブ、コンソール...)
一般的な答えは、Windows.Forms
アプリケーションを開発しているならば、
System.Windows.Forms.Timer クラス。これの利点は、それがUI
スレッド上で実行されるということです、それでそれを定義し、その Tick イベントを購読し、15秒毎にあなたのコードを実行するだけで簡単です。
Windowsフォーム以外の何かをする場合(質問からは明らかではない)、 System.Timers.Timer を選択できますが、this oneは other threadで実行されます。そのため、 Elapsed イベントからいくつかのUI要素を操作しようとしている場合は、「呼び出し」アクセスでそれを管理する必要があります。
あなたのクラスをServiceBase
で参照して、以下のコードをOnStart
eventに入れてください:
Constants.TimeIntervalValue = 1
(hour)..理想的には設定ファイルでこの値を設定するべきです。
StartSendingMails =アプリケーションで実行したい関数名。
protected override void OnStart(string[] args)
{
// It tells in what interval the service will run each time.
Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000;
base.OnStart(args);
TimerCallback timerDelegate = new TimerCallback(StartSendingMails);
serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval));
}