Timer クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
一定の間隔の経過後にイベントを生成します。オプションとして、反復イベントを生成することもできます。
public ref class Timer : System::ComponentModel::Component, System::ComponentModel::ISupportInitialize
public class Timer : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
type Timer = class
inherit Component
interface ISupportInitialize
Public Class Timer
Inherits Component
Implements ISupportInitialize
- 継承
- 実装
例
次の例では、 System.Timers.Timer
2 秒 (2,000 ミリ秒) ごとにイベントを Timer.Elapsed 発生させ、イベントのイベント ハンドラーを設定し、タイマーを開始する オブジェクトをインスタンス化します。 イベント ハンドラーは、プロパティが発生するたびにプロパティの値を ElapsedEventArgs.SignalTime 表示します。
using System;
using System.Timers;
public class Example
{
private static System.Timers.Timer aTimer;
public static void Main()
{
SetTimer();
Console.WriteLine("\nPress the Enter key to exit the application...\n");
Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
Console.ReadLine();
aTimer.Stop();
aTimer.Dispose();
Console.WriteLine("Terminating the application...");
}
private static void SetTimer()
{
// Create a timer with a two second interval.
aTimer = new System.Timers.Timer(2000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime);
}
}
// The example displays output like the following:
// Press the Enter key to exit the application...
//
// The application started at 09:40:29.068
// The Elapsed event was raised at 09:40:31.084
// The Elapsed event was raised at 09:40:33.100
// The Elapsed event was raised at 09:40:35.100
// The Elapsed event was raised at 09:40:37.116
// The Elapsed event was raised at 09:40:39.116
// The Elapsed event was raised at 09:40:41.117
// The Elapsed event was raised at 09:40:43.132
// The Elapsed event was raised at 09:40:45.133
// The Elapsed event was raised at 09:40:47.148
//
// Terminating the application...
open System
open System.Timers
let onTimedEvent source (e: ElapsedEventArgs) =
printfn $"""The Elapsed event was raised at {e.SignalTime.ToString "HH:mm:ss.fff"}"""
// Create a timer with a two second interval.
let aTimer = new Timer 2000
// Hook up the Elapsed event for the timer.
aTimer.Elapsed.AddHandler onTimedEvent
aTimer.AutoReset <- true
aTimer.Enabled <- true
printfn "\nPress the Enter key to exit the application...\n"
printfn $"""The application started at {DateTime.Now.ToString "HH:mm:ss.fff"}"""
stdin.ReadLine() |> ignore
aTimer.Stop()
aTimer.Dispose()
printfn "Terminating the application..."
// The example displays output like the following:
// Press the Enter key to exit the application...
//
// The application started at 09:40:29.068
// The Elapsed event was raised at 09:40:31.084
// The Elapsed event was raised at 09:40:33.100
// The Elapsed event was raised at 09:40:35.100
// The Elapsed event was raised at 09:40:37.116
// The Elapsed event was raised at 09:40:39.116
// The Elapsed event was raised at 09:40:41.117
// The Elapsed event was raised at 09:40:43.132
// The Elapsed event was raised at 09:40:45.133
// The Elapsed event was raised at 09:40:47.148
//
// Terminating the application...
Imports System.Timers
Public Module Example
Private aTimer As System.Timers.Timer
Public Sub Main()
SetTimer()
Console.WriteLine("{0}Press the Enter key to exit the application...{0}",
vbCrLf)
Console.WriteLine("The application started at {0:HH:mm:ss.fff}",
DateTime.Now)
Console.ReadLine()
aTimer.Stop()
aTimer.Dispose()
Console.WriteLine("Terminating the application...")
End Sub
Private Sub SetTimer()
' Create a timer with a two second interval.
aTimer = New System.Timers.Timer(2000)
' Hook up the Elapsed event for the timer.
AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
aTimer.AutoReset = True
aTimer.Enabled = True
End Sub
' The event handler for the Timer.Elapsed event.
Private Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime)
End Sub
End Module
' The example displays output like the following:
' Press the Enter key to exit the application...
'
' The application started at 09:40:29.068
' The Elapsed event was raised at 09:40:31.084
' The Elapsed event was raised at 09:40:33.100
' The Elapsed event was raised at 09:40:35.100
' The Elapsed event was raised at 09:40:37.116
' The Elapsed event was raised at 09:40:39.116
' The Elapsed event was raised at 09:40:41.117
' The Elapsed event was raised at 09:40:43.132
' The Elapsed event was raised at 09:40:45.133
' The Elapsed event was raised at 09:40:47.148
'
' Terminating the application...
注釈
コンポーネントはTimer、プロパティのミリ秒数が経過した後にアプリケーションでIntervalイベントを発生させるElapsedサーバー ベースのタイマーです。 イベントを Timer 1 回だけ発生させるか、 プロパティを使用して繰り返し発生するように オブジェクトを AutoReset 構成できます。 通常、 Timer オブジェクトは必要な限りスコープ内に留まるように、クラス レベルで宣言されます。 その後、そのイベントを Elapsed 処理して、通常の処理を提供できます。 たとえば、1 日 24 時間、週 7 日実行し続ける必要がある重要なサーバーがあるとします。 オブジェクトを使用Timerしてサーバーを定期的にチェックし、システムが稼働していることを確認するサービスを作成できます。 システムが応答していない場合、サービスはサーバーの再起動を試みるか、管理者に通知する可能性があります。
重要
クラスは Timer 、.NET Standard 1.6 以前のバージョンなど、すべての .NET 実装とバージョンで使用できるわけではありません。 このような場合は、代わりに クラスを System.Threading.Timer 使用できます。
この型は IDisposable インターフェイスを実装します。 型の使用が完了したら、直接的または間接的に型を破棄する必要があります。 直接的に型を破棄するには、try
/catch
ブロック内で Dispose メソッドを呼び出します。 間接的に型を破棄するには、using
(C# の場合) または Using
(Visual Basic 言語) などの言語構成要素を使用します。 詳細については、IDisposable インターフェイスに関するトピック内の「IDisposable を実装するオブジェクトの使用」セクションを参照してください。
サーバー ベース System.Timers.Timer のクラスは、マルチスレッド環境のワーカー スレッドで使用するように設計されています。 サーバー タイマーは、発生した Elapsed イベントを処理するためにスレッド間を移動できるため、イベントを発生させる際の Windows タイマーよりも精度が高くなります。
コンポーネントは System.Timers.Timer 、 プロパティの Elapsed 値 (ミリ秒単位) に基づいてイベントを Interval 発生させます。 このイベントを処理して、必要な処理を実行できます。 たとえば、データベースに販売注文を継続的に転記するオンライン販売アプリケーションがあるとします。 出荷の指示をコンパイルするサービスは、各注文を個別に処理するのではなく、注文のバッチで動作します。 を Timer 使用して、30 分ごとにバッチ処理を開始できます。
重要
System.Timers.Timer クラスの解像度は、システム クロックと同じです。 つまり、 プロパティが Elapsed システム クロックの解像度より小さい場合 Interval 、イベントはシステム クロックの解像度によって定義された間隔で発生します。 詳細については、Interval プロパティを参照してください。
注意
使用されるシステム クロックは 、GetTickCount で使用されるのと同じクロックであり、 timeBeginPeriod と timeEndPeriod で行われた変更の影響を受けません。
が にfalse
設定されている場合AutoReset、オブジェクトはSystem.Timers.Timer、最初Intervalの Elapsed が経過した後、イベントを 1 回だけ発生させます。 によって定義されたInterval間隔でイベントをElapsed定期的に発生させ続けるには、 を true
に設定AutoResetします。これは既定値です。
コンポーネントは Timer 、イベントのイベント ハンドラーによってスローされたすべての例外を Elapsed キャッチして抑制します。 この動作は、.NET Frameworkの今後のリリースで変更される可能性があります。 ただし、これは非同期的に実行され、 演算子 (C#では) または Await
演算子 (Visual Basic の場合) を含むawait
イベント ハンドラーには当てはまらないことに注意してください。 これらのイベント ハンドラーでスローされた例外は、次の例に示すように、呼び出し元のスレッドに反映されます。 非同期メソッドでスローされる例外の詳細については、「 例外処理」を参照してください。
using System;
using System.Threading.Tasks;
using System.Timers;
class Example
{
static void Main()
{
Timer timer = new Timer(1000);
timer.Elapsed += async ( sender, e ) => await HandleTimer();
timer.Start();
Console.Write("Press any key to exit... ");
Console.ReadKey();
}
private static Task HandleTimer()
{
Console.WriteLine("\nHandler not implemented..." );
throw new NotImplementedException();
}
}
// The example displays output like the following:
// Press any key to exit...
// Handler not implemented...
//
// Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
// at Example.HandleTimer()
// at Example.<<Main>b__0>d__2.MoveNext()
// --- End of stack trace from previous location where exception was thrown ---
// at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
// at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
// at System.Threading.ThreadPoolWorkQueue.Dispatch()
open System
open System.Threading.Tasks
open System.Timers
let handleTimer () =
printfn "\nHandler not implemented..."
raise (NotImplementedException()): Task
let timer = new Timer 1000
timer.Elapsed.AddHandler(fun sender e -> task { do! handleTimer () } |> ignore)
timer.Start()
printf "Press any key to exit... "
Console.ReadKey() |> ignore
// The example displays output like the following:
// Press any key to exit...
// Handler not implemented...
//
// Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
// at Example.HandleTimer()
// at Example.<<Main>b__0>d__2.MoveNext()
// --- End of stack trace from previous location where exception was thrown ---
// at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
// at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
// at System.Threading.ThreadPoolWorkQueue.Dispatch()
Imports System.Threading.Tasks
Imports System.Timers
Public Module Example
Public Sub Main()
Dim timer As New Timer(1000)
AddHandler timer.Elapsed, AddressOf Example.HandleTimer
'timer.Elapsed = Async ( sender, e ) => await HandleTimer()
timer.Start()
Console.Write("Press any key to exit... ")
Console.ReadKey()
End Sub
Private Async Sub HandleTimer(sender As Object, e As EventArgs)
Await Task.Run(Sub()
Console.WriteLine()
Console.WriteLine("Handler not implemented..." )
Throw New NotImplementedException()
End Sub)
End Sub
End Module
' The example displays output like the following:
' Press any key to exit...
' Handler not implemented...
'
' Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
' at Example._Lambda$__1()
' at System.Threading.Tasks.Task.Execute()
' --- End of stack trace from previous location where exception was thrown ---
' at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
' at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
' at Example.VB$StateMachine_0_HandleTimer.MoveNext()
' --- End of stack trace from previous location where exception was thrown ---
' at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
' at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
' at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
' at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
' at System.Threading.ThreadPoolWorkQueue.Dispatch()
プロパティが のSynchronizingObject場合、null
ElapsedイベントはスレッドでThreadPool発生します。 イベントの処理が Elapsed よりも Interval長く続く場合は、別 ThreadPool のスレッドでイベントが再び発生する可能性があります。 この状況では、イベント ハンドラーを再入可能にする必要があります。
注意
イベント処理メソッドは、あるスレッドで、別のスレッドが メソッドを呼び出すか、 プロパティを Stop に設定すると同時にEnabledfalse
実行される場合があります。 これにより、タイマーが停止した後に Elapsed イベントが発生する可能性があります。 コードの使用例、Stopメソッドは、この競合状態を回避するために 1 つのメソッドを示しています。
が でないnull
Elapsed場合でも、 メソッドまたは Stop メソッドが呼び出された後Dispose、または プロパティが に設定された後Enabledにfalse
イベントが発生する可能性SynchronizingObjectがあります。これは、イベントを発生Elapsedさせるシグナルがスレッド プール スレッドでの実行のために常にキューに入れられます。 この競合状態がのイベント ハンドラーを示すフラグを設定するには解決するのには 1 つのメソッド、Elapsed後続のイベントを無視するイベントです。
そのユーザー インターフェイス要素に System.Timers.Timer タイマーを配置せずに、フォームやコントロールなどのユーザー インターフェイス要素で クラスを使用する場合は、 を含む Timer フォームまたはコントロールを プロパティに SynchronizingObject 割り当てて、イベントがユーザー インターフェイス スレッドにマーシャリングされるようにします。
のインスタンスの既定のプロパティ値の Timer一覧については、 コンストラクターを Timer 参照してください。
ヒント
.NET には という名前 Timer
の 4 つのクラスが含まれており、それぞれが異なる機能を提供します。
- System.Timers.Timer (このトピック): 定期的にイベントを発生させます。 クラスは、マルチスレッド環境でサーバー ベースまたはサービス コンポーネントとして使用することを目的としています。ユーザー インターフェイスがなく、実行時には表示されません。
- System.Threading.Timer: スレッド プール スレッドで一定の間隔で 1 つのコールバック メソッドを実行します。 コールバック メソッドは、タイマーがインスタンス化され、変更できない場合に定義されます。 クラスと同様に System.Timers.Timer 、このクラスは、マルチスレッド環境でサーバー ベースまたはサービス コンポーネントとして使用することを目的としています。ユーザー インターフェイスがなく、実行時には表示されません。
- System.Windows.Forms.Timer: 一定の間隔でイベントを発生させる Windows フォーム コンポーネント。 このコンポーネントにはユーザー インターフェイスがなく、シングルスレッド環境で使用するように設計されています。
- System.Web.UI.Timer(.NET Frameworkのみ): 非同期または同期の Web ページ ポストバックを一定の間隔で実行する ASP.NET コンポーネント。
コンストラクター
Timer() |
Timer クラスの新しいインスタンスを初期化し、すべてのプロパティを初期値に設定します。 |
Timer(Double) | |
Timer(TimeSpan) |
プロパティ
AutoReset |
Timer が Elapsed イベントを一度のみ発生させる ( |
CanRaiseEvents |
コンポーネントがイベントを発生させることがきるかどうかを示す値を取得します。 (継承元 Component) |
Container |
IContainer を含む Component を取得します。 (継承元 Component) |
DesignMode |
Component が現在デザイン モードかどうかを示す値を取得します。 (継承元 Component) |
Enabled | |
Events |
Component に結び付けられているイベント ハンドラーのリストを取得します。 (継承元 Component) |
Interval |
Elapsed イベントの発生間隔を取得または設定します。 |
Site |
デザイン モードで Timer をコンテナーにバインドするサイトを取得または設定します。 |
SynchronizingObject |
指定した間隔が経過したときに発行されるイベント ハンドラー呼び出しをマーシャリングするために使用するオブジェクトを取得または設定します。 |
メソッド
BeginInit() |
フォームまたは別のコンポーネントで使用する Timer の実行時の初期化を開始します。 |
Close() |
Timer で使用したリソースを解放します。 |
CreateObjRef(Type) |
リモート オブジェクトとの通信に使用するプロキシの生成に必要な情報をすべて格納しているオブジェクトを作成します。 (継承元 MarshalByRefObject) |
Dispose() |
Component によって使用されているすべてのリソースを解放します。 (継承元 Component) |
Dispose(Boolean) |
現在の Timer によって使用されているすべてのリソースを解放します。 |
EndInit() |
フォームまたは別のコンポーネントで使用する Timer の実行時の初期化を終了します。 |
Equals(Object) |
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (継承元 Object) |
GetHashCode() |
既定のハッシュ関数として機能します。 (継承元 Object) |
GetLifetimeService() |
古い.
対象のインスタンスの有効期間ポリシーを制御する、現在の有効期間サービス オブジェクトを取得します。 (継承元 MarshalByRefObject) |
GetService(Type) |
Component またはその Container で提供されるサービスを表すオブジェクトを返します。 (継承元 Component) |
GetType() |
現在のインスタンスの Type を取得します。 (継承元 Object) |
InitializeLifetimeService() |
古い.
このインスタンスの有効期間ポリシーを制御する有効期間サービス オブジェクトを取得します。 (継承元 MarshalByRefObject) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。 (継承元 Object) |
MemberwiseClone(Boolean) |
現在の MarshalByRefObject オブジェクトの簡易コピーを作成します。 (継承元 MarshalByRefObject) |
Start() | |
Stop() | |
ToString() |
Component の名前 (存在する場合) を格納する String を返します。 このメソッドはオーバーライドできません。 (継承元 Component) |
イベント
Disposed |
Dispose() メソッドの呼び出しによってコンポーネントが破棄されるときに発生します。 (継承元 Component) |
Elapsed |
間隔が経過すると発生します。 |
適用対象
スレッド セーフ
この型のパブリック static
メンバーはすべてスレッド セーフです。 インスタンス メンバーの場合は、スレッド セーフであるとは限りません。
こちらもご覧ください
.NET