次の方法で共有


Timer.Change メソッド (TimeSpan, TimeSpan)

時間間隔を計るために TimeSpan 値を使用して、タイマの開始時刻とメソッドの呼び出しの間隔を変更します。

Overloads Public Function Change( _
   ByVal dueTime As TimeSpan, _   ByVal period As TimeSpan _) As Boolean
[C#]
public bool Change(TimeSpandueTime,TimeSpanperiod);
[C++]
public: bool Change(TimeSpandueTime,TimeSpanperiod);
[JScript]
public function Change(
   dueTime : TimeSpan,period : TimeSpan) : Boolean;

パラメータ

  • dueTime
    TimeSpan は、 Timer の構築時に指定されたコールバック メソッドを呼び出す前に遅延する時間を表します。タイマが再開されないようにする -1 を指定します。0 を指定して、タイマをすぐに再開します。
  • period
    Timer の構築時に指定されたコールバック メソッドを呼び出す時間間隔。-1 ミリ秒を指定して、周期的なシグナル通知を無効にします。

戻り値

現在のインスタンスが破棄されている場合は true 。それ以外の場合は false

例外

例外の種類 条件
ObjectDisposedException Timer が既に破棄されています。
ArgumentOutOfRangeException dueTime パラメータまたは period パラメータが -1 未満です (ミリ秒単位)。
NotSupportedException dueTime パラメータまたは period パラメータが 4294967294 より大きい値です (ミリ秒単位)。

解説

コールバック メソッドは dueTime が経過した後一度呼び出されます。その後は period で指定した時間間隔が経過するごとに呼び出されます。

dueTime が 0 の場合、コールバック メソッドはすぐに呼び出されます。 dueTime が -1 ミリ秒の場合、コールバック メソッドは呼び出されません。タイマは無効になっていますが、 Change メソッドを呼び出し、 dueTime に正の値を指定することによって再有効化できます。

period が 0 または -1 ミリ秒で、 dueTime が正の値の場合、コールバック メソッドは一度呼び出されます。タイマの定期的な動作は無効になっていますが、 Change メソッドを呼び出し、 period に 0 より大きい値を指定することによって再有効化できます。

使用例

[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

        Dim delayTime As New TimeSpan(0, 0, 1)
        Dim intervalTime As New TimeSpan(0, 0, 0, 0, 250)

        ' 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, delayTime, intervalTime)

        ' When autoEvent signals, change the period to every 
        ' 1/2 second.
        autoEvent.WaitOne(5000, False)
        stateTimer.Change( _
            new TimeSpan(0), intervalTime.Add(intervalTime))
        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);

        TimeSpan delayTime = new TimeSpan(0, 0, 1);
        TimeSpan intervalTime = new TimeSpan(0, 0, 0, 0, 250);

        // 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, delayTime, intervalTime);

        // When autoEvent signals, change the period to every 
        // 1/2 second.
        autoEvent.WaitOne(5000, false);
        stateTimer.Change(new TimeSpan(0), 
            intervalTime + intervalTime);
        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);

    TimeSpan delayTime = TimeSpan(0, 0, 1);
    TimeSpan intervalTime = TimeSpan(0, 0, 0, 0, 250);

    // 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, delayTime, intervalTime);

    // When autoEvent signals, change the period to every 1/2 second.
    autoEvent->WaitOne(5000, false);
    stateTimer->Change(TimeSpan(0), intervalTime + intervalTime);
    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++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: 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, Common Language Infrastructure (CLI) Standard

参照

Timer クラス | Timer メンバ | System.Threading 名前空間 | Timer.Change オーバーロードの一覧 | タイマ