Timer.Change 方法

定义

更改计时器的方法调用之间的开始时间和间隔。

重载

名称 说明
Change(Int32, Int32)

更改计时器的方法调用之间的开始时间和间隔,使用 32 位带符号整数测量时间间隔。

Change(Int64, Int64)

更改计时器的方法调用之间的开始时间和间隔,使用 64 位带符号整数测量时间间隔。

Change(TimeSpan, TimeSpan)

使用 TimeSpan 值来度量时间间隔,更改计时器的方法调用之间的开始时间和间隔。

Change(UInt32, UInt32)

使用 32 位无符号整数来测量时间间隔,更改计时器的方法调用之间的开始时间和间隔。

Change(Int32, Int32)

更改计时器的方法调用之间的开始时间和间隔,使用 32 位带符号整数测量时间间隔。

public:
 bool Change(int dueTime, int period);
public bool Change(int dueTime, int period);
member this.Change : int * int -> bool
Public Function Change (dueTime As Integer, period As Integer) As Boolean

参数

dueTime
Int32

调用构造时 Timer 指定的回调方法(以毫秒为单位)之前延迟的时间量。 指定 Infinite 以防止计时器重启。 指定零(0)以立即重启计时器。

period
Int32

构造回调方法时 Timer 指定的回调方法调用之间的时间间隔(以毫秒为单位)。 指定 Infinite 以禁用定期信号。

返回

true 如果计时器已成功更新,则为 ;否则,为 false.

例外

dueTimeperiod参数为负数,不等于 Infinite

示例

下面的代码示例演示如何在一组调用后启动一个 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.

注解

回调方法在经过后 dueTime 调用一次,之后每次由运行时间指定的 period 时间间隔。

如果 dueTime 为零(0),则立即调用回调方法。 Timeout.Infinite如果是dueTime,则永远不会调用回调方法;计时器被禁用,但可以通过调用Change并指定正值来dueTime重新启用。

如果period为零(0)或Timeout.InfinitedueTime不是Timeout.Infinite,则调用回调方法一次;计时器的定期行为被禁用,但可以通过调用Change并指定正值period来重新启用。

Change可以从委托调用TimerCallback该方法。

另请参阅

适用于

Change(Int64, Int64)

更改计时器的方法调用之间的开始时间和间隔,使用 64 位带符号整数测量时间间隔。

public:
 bool Change(long dueTime, long period);
public bool Change(long dueTime, long period);
member this.Change : int64 * int64 -> bool
Public Function Change (dueTime As Long, period As Long) As Boolean

参数

dueTime
Int64

调用构造时 Timer 指定的回调方法(以毫秒为单位)之前延迟的时间量。 指定 Infinite 以防止计时器重启。 指定零(0)以立即重启计时器。 此值必须小于或等于4294967294。

period
Int64

构造回调方法时 Timer 指定的回调方法调用之间的时间间隔(以毫秒为单位)。 指定 Infinite 以禁用定期信号。

返回

true 如果计时器已成功更新,则为 ;否则,为 false.

例外

dueTimeperiod 小于 -1。

-或-

dueTimeperiod 大于4294967294。

注解

回调方法在经过后 dueTime 调用一次,之后每次由运行时间指定的 period 时间间隔。

如果 dueTime 为零(0),则立即调用回调方法。 Timeout.Infinite如果是dueTime,则永远不会调用回调方法;计时器被禁用,但可以通过调用Change并指定正值来dueTime重新启用。

如果period为零(0)或Timeout.InfinitedueTime不是Timeout.Infinite,则调用回调方法一次;计时器的定期行为被禁用,但可以通过调用Change并指定正值period来重新启用。

Change可以从委托调用TimerCallback该方法。

另请参阅

适用于

Change(TimeSpan, TimeSpan)

使用 TimeSpan 值来度量时间间隔,更改计时器的方法调用之间的开始时间和间隔。

public:
 bool Change(TimeSpan dueTime, TimeSpan period);
public bool Change(TimeSpan dueTime, TimeSpan period);
member this.Change : TimeSpan * TimeSpan -> bool
Public Function Change (dueTime As TimeSpan, period As TimeSpan) As Boolean

参数

dueTime
TimeSpan

一个 TimeSpan 表示在调用构造时 Timer 指定的回调方法之前延迟的时间量。 指定 InfiniteTimeSpan 以防止计时器重启。 指定 Zero 立即重启计时器。

period
TimeSpan

构造时 Timer 指定的回调方法调用之间的时间间隔。 指定 InfiniteTimeSpan 以禁用定期信号。

返回

true 如果计时器已成功更新,则为 ;否则,为 false.

例外

dueTimeperiod参数(以毫秒为单位)小于 -1。

dueTimeperiod参数(以毫秒为单位)大于4294967294。

示例

下面的代码示例演示如何在一组调用后启动一个 Timer 和一组调用后更改其句点。

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();
        }
    }
}
Imports System.Threading

Public Class TimerExample

    <MTAThread> _
    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

注解

回调方法在经过后 dueTime 调用一次,之后每次由运行时间指定的 period 时间间隔。

TimeSpan.Zero如果是dueTime,则立即调用回调方法。 InfiniteTimeSpan如果是dueTime,则永远不会调用回调方法;计时器被禁用,但可以通过调用Change并指定正值来dueTime重新启用。

如果period为或InfiniteTimeSpandueTime且为TimeSpan.Zero正值,则调用回调方法一次;计时器的定期行为被禁用,但可以通过调用Change并指定大于零的值period来重新启用。

Change可以从委托调用TimerCallback该方法。

另请参阅

适用于

Change(UInt32, UInt32)

重要

此 API 不符合 CLS。

使用 32 位无符号整数来测量时间间隔,更改计时器的方法调用之间的开始时间和间隔。

public:
 bool Change(System::UInt32 dueTime, System::UInt32 period);
[System.CLSCompliant(false)]
public bool Change(uint dueTime, uint period);
[<System.CLSCompliant(false)>]
member this.Change : uint32 * uint32 -> bool
Public Function Change (dueTime As UInteger, period As UInteger) As Boolean

参数

dueTime
UInt32

调用构造时 Timer 指定的回调方法(以毫秒为单位)之前延迟的时间量。 指定 Infinite 以防止计时器重启。 指定零(0)以立即重启计时器。

period
UInt32

构造回调方法时 Timer 指定的回调方法调用之间的时间间隔(以毫秒为单位)。 指定 Infinite 以禁用定期信号。

返回

true 如果计时器已成功更新,则为 ;否则,为 false.

属性

例外

注解

回调方法在经过后 dueTime 调用一次,之后每次由运行时间指定的 period 时间间隔。

如果 dueTime 为零(0),则立即调用回调方法。 Timeout.Infinite如果是dueTime,则永远不会调用回调方法;计时器被禁用,但可以通过调用Change并指定正值来dueTime重新启用。

如果period为零(0)或Timeout.InfinitedueTime不是Timeout.Infinite,则调用回调方法一次;计时器的定期行为被禁用,但可以通过调用Change并指定正值period来重新启用。

Change可以从委托调用TimerCallback该方法。

另请参阅

适用于