web-dev-qa-db-ja.com

「タイマー」を実装するための最良の方法は何ですか?

可能な重複:
C#コンソールアプリケーションにタイマーを追加するにはどうすればよいですか

タイマーを実装するための最良の方法は何ですか?コードサンプルは素晴らしいでしょう。この質問では、「最善」とは、最も信頼性が高く(最小失火数)、正確であると定義されます。 15秒の間隔を指定した場合、10 - 20秒ごとではなく、15秒ごとにターゲットメソッドが呼び出されるようにします。一方、ナノ秒の精度は必要ありません。この例では、メソッドが14.51 - 15.49秒ごとに起動することが許容されます。

162
Robert

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です。

274
Dave Zych

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();
35
Jignesh Thakker

明確ではありませんどの種類のアプリケーションを開発しようとしている(デスクトップ、ウェブ、コンソール...)

一般的な答えは、Windows.Formsアプリケーションを開発しているならば、

System.Windows.Forms.Timer クラス。これの利点は、それがUIスレッド上で実行されるということです、それでそれを定義し、その Tick イベントを購読し、15秒毎にあなたのコードを実行するだけで簡単です。

Windowsフォーム以外の何かをする場合(質問からは明らかではない)、 System.Timers.Timer を選択できますが、this oneは other threadで実行されます。そのため、 Elapsed イベントからいくつかのUI要素を操作しようとしている場合は、「呼び出し」アクセスでそれを管理する必要があります。

23
Tigran

あなたのクラスをServiceBaseで参照して、以下のコードをOnStarteventに入れてください:

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));
        }
2
A Developer