次の方法で共有


タイマー

.NET には、マルチスレッド環境で使用する 3 つのタイマーが用意されています。

一部の .NET 実装には、追加のタイマーが含まれる場合があります。

  • System.Windows.Forms.Timer: 一定の間隔でイベントを発生する Windows フォーム コンポーネント。 コンポーネントにはユーザー インターフェイスがなく、シングルスレッド環境で使用するように設計されています。
  • System.Web.UI.Timer: 非同期または同期 Web ページのポストバックを一定の間隔で実行する ASP.NET コンポーネント。
  • System.Windows.Threading.DispatcherTimer: Dispatcher キューに統合されるタイマー。指定された時間間隔で、指定された優先順位で処理されます。

System.Threading.Timer クラス

System.Threading.Timer クラスを使用すると、指定した時間間隔でデリゲートを継続的に呼び出します。 このクラスを使用して、指定した時間間隔でデリゲートへの 1 回の呼び出しをスケジュールすることもできます。 デリゲートは、 ThreadPool スレッドで実行されます。

System.Threading.Timer オブジェクトを作成するときは、コールバック メソッドを定義する TimerCallback デリゲート、コールバックに渡されるオプションの状態オブジェクト、コールバックの最初の呼び出しまでの遅延時間、およびコールバック呼び出し間の時間間隔を指定します。 保留中のタイマーを取り消すには、 Timer.Dispose メソッドを呼び出します。

次の例では、指定されたデリゲートを 1 秒 (1000 ミリ秒) 後に初めて呼び出し、2 秒ごとに呼び出すタイマーを作成します。 この例の state オブジェクトは、デリゲートが呼び出された回数をカウントするために使用されます。 デリゲートが少なくとも 10 回呼び出されると、タイマーは停止します。

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    private static Timer timer;

    static void Main(string[] args)
    {
        var timerState = new TimerState { Counter = 0 };

        timer = new Timer(
            callback: new TimerCallback(TimerTask),
            state: timerState,
            dueTime: 1000,
            period: 2000);

        while (timerState.Counter <= 10)
        {
            Task.Delay(1000).Wait();
        }

        timer.Dispose();
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.");
    }

    private static void TimerTask(object timerState)
    {
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.");
        var state = timerState as TimerState;
        Interlocked.Increment(ref state.Counter);
    }

    class TimerState
    {
        public int Counter;
    }
}
Imports System.Threading

Module Program

    Private Timer As Timer

    Sub Main(args As String())

        Dim StateObj As New TimerState
        StateObj.Counter = 0

        Timer = New Timer(New TimerCallback(AddressOf TimerTask), StateObj, 1000, 2000)

        While StateObj.Counter <= 10
            Task.Delay(1000).Wait()
        End While

        Timer.Dispose()
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.")
    End Sub

    Private Sub TimerTask(ByVal StateObj As Object)

        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.")

        Dim State As TimerState = CType(StateObj, TimerState)
        Interlocked.Increment(State.Counter)
    End Sub

    Private Class TimerState
        Public Counter As Integer
    End Class
End Module

詳細と例については、 System.Threading.Timerを参照してください。

System.Timers.Timer クラス

マルチスレッド環境で使用できるもう 1 つのタイマーは、既定でSystem.Timers.Timer スレッドでイベントを発生させるThreadPoolです。

System.Timers.Timer オブジェクトを作成するときに、Elapsed イベントを発生させる時間間隔を指定できます。 タイマーがEnabled イベントを発生させる必要があるかどうかを示すには、Elapsed プロパティを使用します。 指定した間隔が経過した後に Elapsed イベントを 1 回だけ発生させる必要がある場合は、 AutoResetfalse に設定します。 AutoReset プロパティの既定値はtrue。つまり、Elapsed イベントは、Interval プロパティによって定義された間隔で定期的に発生します。

詳細と例については、 System.Timers.Timerを参照してください。

System.Threading.PeriodicTimer クラス

System.Threading.PeriodicTimer クラスを使用すると、指定した間隔の個々のティックを待機し、PeriodicTimer.WaitForNextTickAsyncを呼び出した後に作業を実行できます。

System.Threading.PeriodicTimer オブジェクトを作成するときは、タイマーの各ティック間の時間の長さを決定するTimeSpanを指定します。 前のタイマー クラスのようにコールバックを渡したりイベント ハンドラーを設定したりする代わりに、スコープ内で直接作業を実行し、指定した間隔でタイマーを進める WaitForNextTickAsync を待ちます。

WaitForNextTickAsync メソッドは、タイマーの正常な起動時にValueTask<bool>true; を返し、falseを呼び出してタイマーが取り消されたときにPeriodicTimer.Disposeします。 WaitForNextTickAsync 必要に応じて、 CancellationTokenを受け入れると、キャンセルが要求されたときに TaskCanceledException が発生します。

詳細については、System.Threading.PeriodicTimerを参照してください。

こちらも参照ください