WinFormsで1秒ごとにイベントハンドラを実行する方法

C# の WinForms アプリケーションでは、一定間隔ごとに処理を実行したいケースがよくあります。

例えば「時計の表示を更新したい」「定期的にデータをチェックしたい」といった場合です。

ここでは、WinForms の Timer クラスを使って「1秒ごとにイベントハンドラを実行する」仕組みを解説します。


1. Timerの基本

WinForms には System.Windows.Forms.Timer というクラスが用意されています。

この Timer は、UI スレッド上で動作するため、フォーム上のラベルやコントロールを安全に更新できる特徴があります。

主なプロパティとイベントは以下の通りです:

  • Interval : ミリ秒単位で間隔を指定(1000 = 1秒)
  • Enabled : タイマーを有効化/無効化
  • Tick イベント : 指定した間隔ごとに呼ばれるイベント

2. サンプルコード

以下のサンプルでは、フォームに Label を置き、1秒ごとに「現在時刻」を更新する処理を実装しています。

using System;
using System.Windows.Forms;

namespace TimerSample
{
    public partial class Form1 : Form
    {
        private readonly Timer _timer = new Timer();

        public Form1()
        {
            InitializeComponent();

            // Timer設定
            _timer.Interval = 1000; // 1000ms = 1秒
            _timer.Tick += Timer_Tick; // イベントハンドラ登録
            _timer.Start(); // タイマー開始
        }

        private void Timer_Tick(object? sender, EventArgs e)
        {
            // 1秒ごとにラベルを更新
            label1.Text = DateTime.Now.ToString("HH:mm:ss");
        }
    }
}

3. 解説

  • Timer.Interval = 1000;→ 1秒ごとに Tick イベントが発生するよう設定。
  • Timer.Tick += Timer_Tick;→ 1秒経過するたびに Timer_Tick メソッドが呼ばれる。
  • label1.Text = DateTime.Now.ToString(“HH:mm:ss");→ ラベルに現在時刻を表示。

4. 注意点

  1. UIスレッドで動作する
    • System.Windows.Forms.Timer は UI スレッドで処理されるため、直接コントロールを操作して問題ありません。
    • 逆に、バックグラウンド処理が必要な場合は System.Timers.Timer や System.Threading.Timer を検討します。
  2. 精度はミリ秒単位ではない
    • Windows のメッセージループに依存するため、厳密な精度は保証されません。
    • 秒単位の更新(時計やUIリフレッシュなど)には十分です。

5. 応用例(スタート/ストップボタン)

ユーザー操作でタイマーを制御したい場合は、次のように Start / Stop を呼び出します。

private void btnStart_Click(object sender, EventArgs e)
{
    _timer.Start();
}

private void btnStop_Click(object sender, EventArgs e)
{
    _timer.Stop();
}

まとめ

  • WinForms では System.Windows.Forms.Timer を使うと簡単に「一定間隔処理」が実現できる。
  • Interval に 1000 を指定すれば、1秒ごとに Tick イベントが発生する。
  • UI スレッドで動作するので、ラベルやテキストボックスの更新もそのまま行える。

実際のアプリケーションでは、時計表示、残り時間のカウントダウン、定期チェック処理など、幅広く活用できます。


訪問数 4 回, 今日の訪問数 1回