時間指定でメソッドをコールする

2023年11月1日

概要

C#で時間を指定をしてメソッドをコールしたいなぁってことがあったので、メモ書きを置いておきます。もっとスマートな方法があればコメント頂ければ幸いです。

ソース

private static System.Threading.Timer timer1;

private void MethodTimeSet()
{
   // 目標時刻までの差を設定
   var time1 = DateTime.Parse("2019/06/20 12:34:56") – DateTime.Now;
   if (time1 < TimeSpan.Zero)
   {
      // 過去が指定された場合、翌日の同時刻に設定
      time1 += new TimeSpan(24, 0, 0);
   }
   // 指定時刻に処理を設定
   timer1 = new System.Threading.Timer(TestMethod, null, time1, new TimeSpan(0, 0, 0));
}

private void TestMethod(object state)
{
   // 別スレッドで処理されるためコントロールを処理したい場合はInvokeする
   this.Invoke((MethodInvoker)(() => textBox1.AppendText("ほげほげ")));
}

ソースの説明

System.Threading.Timerの宣言

System.Threading.Timerは別スレッドで動作します。
参照がない状態ではガベージコレクタの対象となるので、フィールドに定義しています。

メインスレッドでは動作しない

指定時間が来てコールされたメソッドはメインスレッドとは別のスレッドで動作します。
そのため、フォームのコントロール等にアクセスする場合はInvokeメソッドを使用します。
InvokeメソッドはDelegateを扱うので例のようにラムダ式で記述できます。

注意点

System.Threading.Timerはスレッドセーフではないので、複数スレッドから操作を行う場合には注意が必要です。
今回は他のTimerにはない起動までの時間を指定できる機能を特別に使っているだけなので、一定間隔での処理等でTimerを使用する場合は、System.Windows.Forms.TimerやSystem.Timers.Timerを使用してください。

C#

Posted by marimo