.NET には、マルチスレッド環境で使用する 3 つのタイマーが用意されています。
- System.Threading.Timerは、一定の間隔で ThreadPool スレッドで 1 つのコールバック メソッドを実行します。
- System.Timers.Timerは、既定では一定の間隔で ThreadPool スレッドでイベントを発生させます。
- System.Threading.PeriodicTimerは、タイマーの各ティックを待機した後に呼び出し元が処理を行うことができるようにします。
注
一部の .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 回だけ発生させる必要がある場合は、 AutoReset を false に設定します。
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を参照してください。
こちらも参照ください
.NET