タイマーTimers

.NET には、マルチスレッド環境で使用するタイマーが 2 つあります。.NET provides two timers to use in a multithreaded environment:

注意

一部の .NET 実装には追加タイマーが含まれています。Some .NET implementations may include additional timers:

  • System.Windows.Forms.Timer: 一定の間隔でイベントを発生させる Windows フォーム コンポーネント。System.Windows.Forms.Timer: a Windows Forms component that fires an event at regular intervals. このコンポーネントにはユーザー インターフェイスがなく、シングルスレッド環境で使用するように設計されています。The component has no user interface and is designed for use in a single-threaded environment.
  • System.Web.UI.Timer: 非同期または同期の Web ページのポストバックを一定の間隔で実行する ASP.NET コンポーネント。System.Web.UI.Timer: an ASP.NET component that performs asynchronous or synchronous web page postbacks at a regular interval.
  • System.Windows.Threading.DispatcherTimer: 指定の間隔と指定の優先順位で処理される Dispatcher キューに統合されるタイマー。System.Windows.Threading.DispatcherTimer: a timer that is integrated into the Dispatcher queue which is processed at a specified interval of time and at a specified priority.

System.Threading.Timer クラスThe System.Threading.Timer class

System.Threading.Timer クラスによって、指定の間隔でデリゲートを連続的に呼び出すことができます。The System.Threading.Timer class enables you to continuously call a delegate at specified time intervals. このクラスを使用し、指定の間隔でデリゲートの呼び出しを 1 つスケジュールすることもできます。You also can use this class to schedule a single call to a delegate in a specified time interval. デリゲートは ThreadPool スレッドで実行されます。The delegate is executed on a ThreadPool thread.

System.Threading.Timer オブジェクトを作成するとき、呼び出しメソッドを定義する TimerCallback デリゲート、呼び出しに渡される任意の状態オブジェクト、最初の呼び出しまで遅らせる時間、呼び出し間隔を指定します。When you create a System.Threading.Timer object, you specify a TimerCallback delegate that defines the callback method, an optional state object that is passed to the callback, the amount of time to delay before the first invocation of the callback, and the time interval between callback invocations. 保留中のタイマーを取り消すには、Timer.Dispose メソッドを呼び出します。To cancel a pending timer, call the Timer.Dispose method.

次の例では、1 秒 (1000 ミリ秒) 後に最初の指定デリゲートを呼び出し、その後、2 秒おきに呼び出すタイマーが作成されます。The following example creates a timer that calls the provided delegate for the first time after one second (1000 milliseconds) and then calls it every two seconds. この例の状態オブジェクトは、デリゲートを呼び出す回数を数えるために使用されます。The state object in the example is used to count how many times the delegate is called. デリゲートが少なくとも 10 回呼び出されると、タイマーが停止します。The timer is stopped when the delegate has been called at least 10 times.

using namespace System;
using namespace System::Threading;

ref class TimerState
{
public:
    int counter;
};

ref class Example
{
private:
    static Timer^ timer;

public:
    static void TimerTask(Object^ state)
    {
        Console::WriteLine("{0:HH:mm:ss.fff}: starting a new callback.", DateTime::Now);

        TimerState^ timerState = dynamic_cast<TimerState^>(state);
        Interlocked::Increment(timerState->counter);
    }

    static void Main()
    {
        TimerCallback^ tcb = gcnew TimerCallback(&TimerTask);
        TimerState^ state = gcnew TimerState();
        state->counter = 0;
        timer = gcnew Timer(tcb, state, 1000, 2000);

        while (state->counter <= 10)
        {
            Thread::Sleep(1000);
        }

        timer->~Timer();
        Console::WriteLine("{0:HH:mm:ss.fff}: done.", DateTime::Now);
    }
};

int main()
{
    Example::Main();
}
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」を参照してください。For more information and examples, see System.Threading.Timer.

System.Timers.Timer クラスThe System.Timers.Timer class

マルチスレッド環境で使用できる別のタイマーが System.Timers.Timer です。このタイマーは既定で、ThreadPool スレッドでイベントを発生させます。Another timer that can be used in a multithreaded environment is System.Timers.Timer that by default raises an event on a ThreadPool thread.

System.Timers.Timer オブジェクトを作成するとき、Elapsed イベントを発生させる間隔を指定できます。When you create a System.Timers.Timer object, you may specify the time interval in which to raise an Elapsed event. Enabled プロパティを使用し、タイマーが Elapsed イベントを発生させるかどうかを示します。Use the Enabled property to indicate if a timer should raise an Elapsed event. 指定間隔の経過後、1 回だけ Elapsed イベントを発生させる必要がある場合、AutoResetfalse に設定します。If you need an Elapsed event to be raised only once after the specified interval has elapsed, set the AutoReset to false. AutoReset プロパティの既定値は true です。Interval プロパティで定義される間隔で Elapsed イベントが発生します。The default value of the AutoReset property is true, which means that an Elapsed event is raised regularly at the interval defined by the Interval property.

使用例を含む詳細については、「System.Timers.Timer」を参照してください。For more information and examples, see System.Timers.Timer.

関連項目See also