Timer クラス
指定した間隔でメソッドを実行するための機構を提供します。このクラスは継承できません。
この型のすべてのメンバの一覧については、Timer メンバ を参照してください。
System.Object
System.MarshalByRefObject
System.Threading.Timer
NotInheritable Public Class Timer
Inherits MarshalByRefObject
Implements IDisposable
[C#]
public sealed class Timer : MarshalByRefObject, IDisposable
[C++]
public __gc __sealed class Timer : public MarshalByRefObject,
IDisposable
[JScript]
public class Timer extends MarshalByRefObject implements
IDisposable
スレッドセーフ
この型は、マルチスレッド操作に対して安全です。
解説
TimerCallback デリゲートを使用して、 Timer で実行するメソッドを指定します。タイマ デリゲートは、タイマの構築時に指定され、変更することはできません。このメソッドは、タイマを作成したスレッドで実行されず、システムが提供するスレッド プール スレッドで実行されます。
タイマを作成するときは、メソッドを最初に実行するまでの待機時間 (期限) と、その後の実行ごとに待機する時間 (期間) を指定できます。 Change メソッドを使用して、これらの値を変更したり、タイマを無効にしたりできます。
メモ Timer を使用している間は、このクラスへの参照を保持しておく必要があります。他のマネージ オブジェクトと同様、まったく参照されていない場合、 Timer はガベージ コレクションの対象となります。 Timer がアクティブであっても、ガベージ コレクションの対象から除外されることはありません。
タイマが不要になった場合は、 Dispose メソッドを使用して、そのタイマが保持しているリソースを解放します。
メモ System.Threading.Timer はシンプルで軽いタイマです。コールバック メソッドを使用し、スレッド プール スレッドがサービスを提供します。Windows フォームで使用する場合は System.Windows.Forms.Timer を、サーバー ベースのタイマ機能が必要な場合は System.Timers.Timer を使用することもできます。これらのタイマはイベントを処理でき、追加機能が用意されています。
使用例
[Visual Basic, C#, C++] Timer クラスの機能を次の例で示します。
Imports Microsoft.VisualBasic
Imports System
Imports System.Threading
Public Class TimerExample
Shared Sub Main()
Dim autoEvent As New AutoResetEvent(False)
Dim statusChecker As New StatusChecker(10)
' Create the delegate that invokes methods for the timer.
Dim timerDelegate As TimerCallback = _
AddressOf statusChecker.CheckStatus
' Create a timer that signals the delegate to invoke
' CheckStatus after one second, and every 1/4 second
' thereafter.
Console.WriteLine("{0} Creating timer." & vbCrLf, _
DateTime.Now.ToString("h:mm:ss.fff"))
Dim stateTimer As Timer = _
New Timer(timerDelegate, autoEvent, 1000, 250)
' When autoEvent signals, change the period to every
' 1/2 second.
autoEvent.WaitOne(5000, False)
stateTimer.Change(0, 500)
Console.WriteLine(vbCrLf & "Changing period." & vbCrLf)
' When autoEvent signals the second time, dispose of
' the timer.
autoEvent.WaitOne(5000, False)
stateTimer.Dispose()
Console.WriteLine(vbCrLf & "Destroying timer.")
End Sub
End Class
Public Class StatusChecker
Dim invokeCount, maxCount As Integer
Sub New(count As Integer)
invokeCount = 0
maxCount = count
End Sub
' This method is called by the timer delegate.
Sub CheckStatus(stateInfo As Object)
Dim autoEvent As AutoResetEvent = _
DirectCast(stateInfo, AutoResetEvent)
invokeCount += 1
Console.WriteLine("{0} Checking status {1,2}.", _
DateTime.Now.ToString("h:mm:ss.fff"), _
invokeCount.ToString())
If invokeCount = maxCount Then
' Reset the counter and signal to stop the timer.
invokeCount = 0
autoEvent.Set()
End If
End Sub
End Class
[C#]
using System;
using System.Threading;
class TimerExample
{
static void Main()
{
AutoResetEvent autoEvent = new AutoResetEvent(false);
StatusChecker statusChecker = new StatusChecker(10);
// Create the delegate that invokes methods for the timer.
TimerCallback timerDelegate =
new TimerCallback(statusChecker.CheckStatus);
// Create a timer that signals the delegate to invoke
// CheckStatus after one second, and every 1/4 second
// thereafter.
Console.WriteLine("{0} Creating timer.\n",
DateTime.Now.ToString("h:mm:ss.fff"));
Timer stateTimer =
new Timer(timerDelegate, autoEvent, 1000, 250);
// When autoEvent signals, change the period to every
// 1/2 second.
autoEvent.WaitOne(5000, false);
stateTimer.Change(0, 500);
Console.WriteLine("\nChanging period.\n");
// When autoEvent signals the second time, dispose of
// the timer.
autoEvent.WaitOne(5000, false);
stateTimer.Dispose();
Console.WriteLine("\nDestroying timer.");
}
}
class StatusChecker
{
int invokeCount, maxCount;
public StatusChecker(int count)
{
invokeCount = 0;
maxCount = count;
}
// This method is called by the timer delegate.
public void CheckStatus(Object stateInfo)
{
AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
Console.WriteLine("{0} Checking status {1,2}.",
DateTime.Now.ToString("h:mm:ss.fff"),
(++invokeCount).ToString());
if(invokeCount == maxCount)
{
// Reset the counter and signal Main.
invokeCount = 0;
autoEvent.Set();
}
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Threading;
__gc class StatusChecker
{
int invokeCount, maxCount;
public:
StatusChecker(int count) : invokeCount(0), maxCount(count) {}
// This method is called by the timer delegate.
void CheckStatus(Object* stateInfo)
{
AutoResetEvent* autoEvent =
dynamic_cast<AutoResetEvent*>(stateInfo);
Console::WriteLine(S"{0} Checking status {1,2}.",
DateTime::Now.ToString("h:mm:ss.fff"),
(++invokeCount).ToString());
if(invokeCount == maxCount)
{
// Reset the counter and signal main.
invokeCount = 0;
autoEvent->Set();
}
}
};
void main()
{
AutoResetEvent* autoEvent = new AutoResetEvent(false);
StatusChecker* statusChecker = new StatusChecker(10);
// Create the delegate that invokes methods for the timer.
TimerCallback* timerDelegate =
new TimerCallback(statusChecker, &StatusChecker::CheckStatus);
// Create a timer that signals the delegate to invoke CheckStatus
// after one second, and every 1/4 second thereafter.
Console::WriteLine(S"{0} Creating timer.\n",
DateTime::Now.ToString("h:mm:ss.fff"));
Timer* stateTimer =
new Timer(timerDelegate, autoEvent, 1000, 250);
// When autoEvent signals, change the period to every 1/2 second.
autoEvent->WaitOne(5000, false);
stateTimer->Change(0, 500);
Console::WriteLine(S"\nChanging period.\n");
// When autoEvent signals the second time, dispose of the timer.
autoEvent->WaitOne(5000, false);
stateTimer->Dispose();
Console::WriteLine(S"\nDestroying timer.");
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Threading
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET
アセンブリ: Mscorlib (Mscorlib.dll 内)
参照
Timer メンバ | System.Threading 名前空間 | TimerCallback | タイマ | スレッド プーリング