Timer Timer Timer Timer Class

定義

指定した間隔で、スレッド プール スレッドでメソッドを実行するための機構を提供します。Provides a mechanism for executing a method on a thread pool thread at specified intervals. このクラスは継承できません。This class cannot be inherited.

public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
継承
属性
実装

次の例ではStatusChecker 、シグネチャTimerCallbackがデリゲートCheckStatusと同じであるメソッドを含むクラスを定義しています。The following example defines a StatusChecker class that includes a CheckStatus method whose signature is the same as the TimerCallback delegate. メソッドの引数は、アプリケーションスレッドAutoResetEventと、コールバックデリゲートを実行するスレッドプールスレッドを同期するために使用されるオブジェクトです。 state CheckStatusThe state argument of the CheckStatus method is an AutoResetEvent object that is used to synchronize the application thread and the thread pool thread that executes the callback delegate. クラスStatusCheckerには、次の2つの状態変数も含まれています。The StatusChecker class also includes two state variables:

invokeCount
コールバックメソッドが呼び出された回数を示します。Indicates the number of times the callback method has been invoked.

maxCount
コールバックメソッドを呼び出すことができる最大回数を決定します。Determines the maximum number of times the callback method should be invoked.

アプリケーションスレッドは、1秒間待機してから、250ミリ秒CheckStatusごとにコールバックメソッドを実行するタイマーを作成します。The application thread creates the timer, which waits one second and then executes the CheckStatus callback method every 250 milliseconds. アプリケーションスレッドは、 AutoResetEventオブジェクトがシグナル状態になるまでブロックします。The application thread then blocks until the AutoResetEvent object is signaled. コールバックCheckStatusメソッドがmaxCount AutoResetEvent時間を実行すると、メソッドを呼び出して、オブジェクトの状態をシグナル状態に設定します。AutoResetEvent.SetWhen the CheckStatus callback method executes maxCount times, it calls the AutoResetEvent.Set method to set the state of the AutoResetEvent object to signaled. これが初めて発生したとき、アプリケーションスレッドChange(Int32, Int32)はメソッドを呼び出し、コールバックメソッドが0.5 秒ごとに実行されるようになります。The first time this happens, the application thread calls the Change(Int32, Int32) method so that the callback method now executes every half second. AutoResetEventオブジェクトがシグナル状態になるまで、再度ブロックされます。It once again blocks until the AutoResetEvent object is signaled. この場合、タイマーはDisposeメソッドを呼び出すことによって破棄され、アプリケーションは終了します。When this happens, the timer is destroyed by calling its Dispose method, and the application terminates.

using namespace System;
using namespace System::Threading;

ref class StatusChecker
{
private:
    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("{0:h:mm:ss.fff} Checking status {1,2}.",
                           DateTime::Now, ++invokeCount);

        if (invokeCount == maxCount) {
            // Reset the counter and signal the waiting thread.
            invokeCount  = 0;
            autoEvent->Set();
        }
    }
};

ref class TimerExample
{
public:
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        AutoResetEvent^ autoEvent = gcnew AutoResetEvent(false);

        StatusChecker^ statusChecker = gcnew StatusChecker(10);

        // Create a delegate that invokes methods for the timer.
        TimerCallback^ tcb =
           gcnew TimerCallback(statusChecker, &StatusChecker::CheckStatus);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console::WriteLine("{0:h:mm:ss.fff} Creating timer.\n",
                           DateTime::Now);
        Timer^ stateTimer = gcnew Timer(tcb, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent->WaitOne(5000, false);
        stateTimer->Change(0, 500);
        Console::WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent->WaitOne(5000, false);
        stateTimer->~Timer();
        Console::WriteLine("\nDestroying timer.");
    }
};

int main()
{
    TimerExample::Main();
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        var autoEvent = new AutoResetEvent(false);
        
        var statusChecker = new StatusChecker(10);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n", 
                          DateTime.Now);
        var stateTimer = new Timer(statusChecker.CheckStatus, 
                                   autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne();
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne();
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    }
}

class StatusChecker
{
    private int invokeCount;
    private int  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 the waiting thread.
            invokeCount = 0;
            autoEvent.Set();
        }
    }
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Use an AutoResetEvent to signal the timeout threshold in the
        ' timer callback has been reached.
        Dim autoEvent As New AutoResetEvent(False)

        Dim statusChecker As New StatusChecker(10)

        ' Create a timer that invokes CheckStatus after one second, 
        ' and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer." & vbCrLf, 
                          DateTime.Now)
        Dim stateTimer As New Timer(AddressOf statusChecker.CheckStatus, 
                                    autoEvent, 1000, 250)

        ' When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne()
        stateTimer.Change(0, 500)
        Console.WriteLine(vbCrLf & "Changing period to .5 seconds." & vbCrLf)

        ' When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne()
        stateTimer.Dispose()
        Console.WriteLine(vbCrLf & "Destroying timer.")
    End Sub
End Module

Public Class StatusChecker
    Dim invokeCount, maxCount As Integer 

    Sub New(count As Integer)
        invokeCount  = 0
        maxCount = count
    End Sub

    ' The timer callback method.
    Sub CheckStatus(stateInfo As Object)
        Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
        invokeCount += 1
        Console.WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.", 
                          DateTime.Now, invokeCount)
        If invokeCount = maxCount Then
            ' Reset the counter and signal the waiting thread.
            invokeCount = 0
            autoEvent.Set()
        End If
    End Sub
End Class
' The example displays output like the following:
'       11:59:54.202 Creating timer.
'       
'       11:59:55.217 Checking status  1.
'       11:59:55.466 Checking status  2.
'       11:59:55.716 Checking status  3.
'       11:59:55.968 Checking status  4.
'       11:59:56.218 Checking status  5.
'       11:59:56.470 Checking status  6.
'       11:59:56.722 Checking status  7.
'       11:59:56.972 Checking status  8.
'       11:59:57.223 Checking status  9.
'       11:59:57.473 Checking status 10.
'       
'       Changing period to .5 seconds.
'       
'       11:59:57.474 Checking status  1.
'       11:59:57.976 Checking status  2.
'       11:59:58.476 Checking status  3.
'       11:59:58.977 Checking status  4.
'       11:59:59.477 Checking status  5.
'       11:59:59.977 Checking status  6.
'       12:00:00.478 Checking status  7.
'       12:00:00.980 Checking status  8.
'       12:00:01.481 Checking status  9.
'       12:00:01.981 Checking status 10.
'       
'       Destroying timer.

注釈

デリゲートを使用して、でTimer実行するメソッドを指定します。 TimerCallbackUse a TimerCallback delegate to specify the method you want the Timer to execute. TimerCallbackデリゲートのシグネチャは次のとおりです。The signature of the TimerCallback delegate is:

void TimerCallback(Object state)  
void TimerCallback(Object state)  
Sub TimerCallback(state As Object)  

タイマーデリゲートは、タイマーが構築されるときに指定され、変更することはできません。The timer delegate is specified when the timer is constructed, and cannot be changed. タイマーを作成したスレッドでは、メソッドは実行されません。システムによってThreadPool提供されるスレッド上で実行されます。The method does not execute on the thread that created the timer; it executes on a ThreadPool thread supplied by the system.

ヒント

.Net には、とTimerいう4つのクラスが含まれており、それぞれに異なる機能が用意されています。.NET includes four classes named Timer, each of which offers different functionality:

  • System.Timers.Timer。イベントを発生させ、一定の間隔で1つ以上のイベントシンクでコードを実行します。System.Timers.Timer, which fires an event and executes the code in one or more event sinks at regular intervals. クラスは、マルチスレッド環境でサーバーベースまたはサービスコンポーネントとして使用することを目的としています。ユーザーインターフェイスはなく、実行時には表示されません。The class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
  • System.Threading.Timer。一定の間隔でスレッドプールスレッドに対して単一のコールバックメソッドを実行します。System.Threading.Timer, which executes a single callback method on a thread pool thread at regular intervals. コールバックメソッドは、タイマーがインスタンス化され、変更できないときに定義されます。The callback method is defined when the timer is instantiated and cannot be changed. System.Timers.Timerクラスと同様に、このクラスは、マルチスレッド環境でサーバーベースまたはサービスコンポーネントとして使用することを意図しています。ユーザーインターフェイスはなく、実行時には表示されません。Like the System.Timers.Timer class, this class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
  • System.Windows.Forms.Timer(.NET Framework のみ)。イベントを発生させ、1つ以上のイベントシンクで一定の間隔でコードを実行する Windows フォームコンポーネントです。System.Windows.Forms.Timer (.NET Framework only), a Windows Forms component that fires an event and executes the code in one or more event sinks at regular intervals. コンポーネントにはユーザーインターフェイスがなく、シングルスレッド環境で使用できるように設計されています。UI スレッドで実行されます。The component has no user interface and is designed for use in a single-threaded environment; it executes on the UI thread.
  • System.Web.UI.Timer(.NET Framework のみ) 非同期または同期の web ページポストバックを一定の間隔で実行する ASP.NET コンポーネント。System.Web.UI.Timer (.NET Framework only), an ASP.NET component that performs asynchronous or synchronous web page postbacks at a regular interval.

タイマーを作成するときに、メソッドの最初の実行までの待機時間 (期限) と、その後の実行 (期間) の間に待機する時間を指定できます。When you create a timer, you can specify an amount of time to wait before the first execution of the method (due time), and an amount of time to wait between subsequent executions (period). クラスTimerには、システムクロックと同じ解決策があります。The Timer class has the same resolution as the system clock. つまり、期間がシステムクロックTimerCallbackの解像度よりも小さい場合、デリゲートは、システムクロックの解像度で定義された間隔で実行されます。これは、windows 7 および windows 8 システムで約15ミリ秒です。This means that if the period is less than the resolution of the system clock, the TimerCallback delegate will execute at intervals defined by the resolution of the system clock, which is approximately 15 milliseconds on Windows 7 and Windows 8 systems. Changeメソッドを使用して、期限と期間を変更したり、タイマーを無効にしたりすることができます。You can change the due time and period, or disable the timer, by using the Change method.

注意

を使用Timerしている限り、参照を保持する必要があります。As long as you are using a Timer, you must keep a reference to it. すべてのマネージオブジェクトTimerと同様に、には参照がない場合にガベージコレクションが適用されます。As with any managed object, a Timer is subject to garbage collection when there are no references to it. Timerがまだアクティブになっているという事実は、収集が妨げられることはありません。The fact that a Timer is still active does not prevent it from being collected.

タイマーが不要になった場合は、 Disposeメソッドを使用して、タイマーによって保持されているリソースを解放します。When a timer is no longer needed, use the Dispose method to free the resources held by the timer. タイマーはスレッドプールスレッドによっDispose()て実行されるコールバックをキューに置いているため、メソッドのオーバーロードが呼び出された後にコールバックが発生する可能性があることに注意してください。Note that callbacks can occur after the Dispose() method overload has been called, because the timer queues callbacks for execution by thread pool threads. メソッドオーバーロードを使用Dispose(WaitHandle)して、すべてのコールバックが完了するまで待機することができます。You can use the Dispose(WaitHandle) method overload to wait until all callbacks have completed.

タイマーによって実行されるコールバックメソッドはスレッドでThreadPool呼び出されるため、再入可能である必要があります。The callback method executed by the timer should be reentrant, because it is called on ThreadPool threads. タイマー間隔がコールバックの実行に必要な時間より短い場合、またはすべてのスレッドプールスレッドが使用中で、コールバックが複数回キューに配置されている場合、コールバックは2つのスレッドプールスレッドで同時に実行できます。The callback can be executed simultaneously on two thread pool threads if the timer interval is less than the time required to execute the callback, or if all thread pool threads are in use and the callback is queued multiple times.

注意

System.Threading.Timerは、コールバックメソッドを使用し、スレッドプールのスレッドによって提供される単純で軽量なタイマーです。System.Threading.Timer is a simple, lightweight timer that uses callback methods and is served by thread pool threads. コールバックはユーザーインターフェイススレッドでは発生しないため、Windows フォームでの使用はお勧めしません。It is not recommended for use with Windows Forms, because its callbacks do not occur on the user interface thread. System.Windows.Forms.Timerは、Windows フォームでの使用に適した選択肢です。System.Windows.Forms.Timer is a better choice for use with Windows Forms. サーバーベースのタイマー機能については、をSystem.Timers.Timer使用することを検討してください。これは、イベントを発生させ、追加機能を備えています。For server-based timer functionality, you might consider using System.Timers.Timer, which raises events and has additional features.

コンストラクター

Timer(TimerCallback) Timer(TimerCallback) Timer(TimerCallback) Timer(TimerCallback)

状態オブジェクトとして新しく作成した Timer を使用して、無制限の期間および無制限の期限を指定して Timer クラスの新しいインスタンスを初期化します。Initializes a new instance of the Timer class with an infinite period and an infinite due time, using the newly created Timer object as the state object.

Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32)

時間間隔を指定するために 32 ビット符号付き整数を使用して、Timer クラスの新しいインスタンスを初期化します。Initializes a new instance of the Timer class, using a 32-bit signed integer to specify the time interval.

Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64)

時間間隔を計るために 64 ビット符号付き整数を使用して、Timer クラスの新しいインスタンスを初期化します。Initializes a new instance of the Timer class, using 64-bit signed integers to measure time intervals.

Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan)

時間間隔を計るために TimeSpan 値を使用して、Timer クラスの新しいインスタンスを初期化します。Initializes a new instance of the Timer class, using TimeSpan values to measure time intervals.

Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32)

時間間隔を計るために 32 ビット符号なし整数を使用して、Timer クラスの新しいインスタンスを初期化します。Initializes a new instance of the Timer class, using 32-bit unsigned integers to measure time intervals.

プロパティ

ActiveCount ActiveCount ActiveCount ActiveCount

現在アクティブなタイマーの数を取得します。Gets the number of timers that are currently active. アクティブなタイマーは、将来のある時点でティックするように登録されており、まだキャンセルされていません。An active timer is registered to tick at some point in the future, and has not yet been canceled.

メソッド

Change(Int32, Int32) Change(Int32, Int32) Change(Int32, Int32) Change(Int32, Int32)

時間間隔を計るために 32 ビット符号付き整数を使用して、タイマーの開始時刻とメソッドの呼び出しの間隔を変更します。Changes the start time and the interval between method invocations for a timer, using 32-bit signed integers to measure time intervals.

Change(Int64, Int64) Change(Int64, Int64) Change(Int64, Int64) Change(Int64, Int64)

時間間隔を計るために 64 ビット符号付き整数を使用して、タイマーの開始時刻とメソッドの呼び出しの間隔を変更します。Changes the start time and the interval between method invocations for a timer, using 64-bit signed integers to measure time intervals.

Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan)

時間間隔を計るために TimeSpan 値を使用して、タイマーの開始時刻とメソッドの呼び出しの間隔を変更します。Changes the start time and the interval between method invocations for a timer, using TimeSpan values to measure time intervals.

Change(UInt32, UInt32) Change(UInt32, UInt32) Change(UInt32, UInt32) Change(UInt32, UInt32)

時間間隔を計るために 32 ビット符号なし整数を使用して、タイマーの開始時刻とメソッドの呼び出しの間隔を変更します。Changes the start time and the interval between method invocations for a timer, using 32-bit unsigned integers to measure time intervals.

CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type)

リモート オブジェクトとの通信に使用するプロキシの生成に必要な情報をすべて格納しているオブジェクトを作成します。Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

(Inherited from MarshalByRefObject)
Dispose() Dispose() Dispose() Dispose()

Timer の現在のインスタンスによって使用されているすべてのリソースを解放します。Releases all resources used by the current instance of Timer.

Dispose(WaitHandle) Dispose(WaitHandle) Dispose(WaitHandle) Dispose(WaitHandle)

Timer の現在のインスタンスによって使用されているすべてのリソースを解放し、タイマーが破棄されたときに通知します。Releases all resources used by the current instance of Timer and signals when the timer has been disposed of.

DisposeAsync() DisposeAsync() DisposeAsync() DisposeAsync()

Timer の現在のインスタンスによって使用されているすべてのリソースを解放します。Releases all resources used by the current instance of Timer.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(Inherited from Object)
Finalize() Finalize() Finalize() Finalize()

オブジェクトが、ガベージ コレクションによって収集される前に、リソースの解放とその他のクリーンアップ操作の実行を試みることができるようにします。Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(Inherited from Object)
GetLifetimeService() GetLifetimeService() GetLifetimeService() GetLifetimeService()

対象のインスタンスの有効期間ポリシーを制御する、現在の有効期間サービス オブジェクトを取得します。Retrieves the current lifetime service object that controls the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
GetType() GetType() GetType() GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(Inherited from Object)
InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService()

このインスタンスの有効期間ポリシーを制御する有効期間サービス オブジェクトを取得します。Obtains a lifetime service object to control the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(Inherited from Object)
MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean)

現在の MarshalByRefObject オブジェクトの簡易コピーを作成します。Creates a shallow copy of the current MarshalByRefObject object.

(Inherited from MarshalByRefObject)
ToString() ToString() ToString() ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(Inherited from Object)

適用対象

スレッド セーフ

この型はスレッド セーフです。This type is thread safe.

こちらもご覧ください