添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
Public NotInheritable Class Timer
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Object
Timer

下列範例會定義類別 StatusChecker ,其中包含 CheckStatus 其簽章與委派相同的 TimerCallback 方法。 方法 state CheckStatus 引數是 AutoResetEvent 物件,用來同步處理應用程式執行緒和執行回呼委派的執行緒集區執行緒。 類別 StatusChecker 也包含兩個狀態變數:

invokeCount
指出已叫用回呼方法的次數。

maxCount
決定應該叫用回呼方法的最大次數。

應用程式執行緒會建立計時器,它會等候一秒,然後每隔 250 毫秒執行 CheckStatus 回呼方法。 應用程式執行緒接著會封鎖直到 AutoResetEvent 物件收到訊號為止。 CheckStatus 當回呼方法執行 maxCount 時間時,它會呼叫 AutoResetEvent.Set 方法,將物件的狀態 AutoResetEvent 設定為已發出訊號。 第一次發生這種情況時,應用程式執行緒會呼叫 Change(Int32, Int32) 方法,讓回呼方法現在每隔半秒執行一次。 它會再次封鎖, AutoResetEvent 直到物件收到訊號為止。 發生這種情況時,計時器會藉由呼叫其 Dispose 方法而終結,而應用程式會終止。

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.

TimerCallback 使用委派來指定您想要 Timer 執行的方法。 委派的 TimerCallback 簽章為:

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

計時器委派是在建構計時器時指定,而且無法變更。 方法不會在建立計時器的執行緒上執行;它會在系統提供的執行緒上 ThreadPool 執行。

.NET 包含數個計時器類別,每個類別都提供不同的功能:

  • System.Timers.Timer,它會定期引發事件,並在一或多個事件接收中執行程式碼。 類別適用于在多執行緒環境中當做伺服器型或服務元件使用;它沒有使用者介面,而且在執行時間看不到。
  • System.Threading.Timer,它會定期線上程集區執行緒上執行單一回呼方法。 當計時器具現化且無法變更時,就會定義回呼方法。 System.Timers.Timer如同 類別,這個類別適用于在多執行緒環境中當做伺服器型或服務元件使用;它沒有使用者介面,而且在執行時間不會顯示。
  • System.Windows.Forms.Timer,Windows Forms元件,它會引發事件,並在一或多個事件接收中定期執行程式碼。 元件沒有使用者介面,而且是專為在單一執行緒環境中使用而設計;它會在 UI 執行緒上執行。
  • System.Web.UI.Timer (.NET Framework只) ,ASP.NET 元件會定期執行非同步或同步網頁回傳。
  • System.Windows.Threading.DispatcherTimer,這是已整合到佇列中的 Dispatcher 計時器。 此計時器會以指定時間間隔的指定優先權來處理。
  • 當您建立計時器時,您可以指定在方法第一次執行前等候的時間量, (到期時間) ,以及後續執行 (期間之間等候的時間量) 。 類別 Timer 的解析度與系統時鐘相同。 這表示如果期間小於系統時鐘的解析度, TimerCallback 委派會以系統時鐘的解析所定義的間隔執行,這大約是 15 毫秒在 Windows 7 和 Windows 8 系統上。 您可以使用 方法來變更到期時間和期間,或停用計時器 Change

    只要您使用 Timer ,您就必須保留其參考。 如同任何 Managed 物件,當沒有任何參考時, Timer 會受限於垃圾收集。 仍在 Timer 使用中的事實不會防止收集它。

    所使用的系統時鐘是 GetTickCount所使用的相同時鐘,這不會受到 timeBeginPeriodtimeEndPeriod所做的變更所影響。

    不再需要計時器時,請使用 Dispose 方法來釋放計時器所保留的資源。 請注意,呼叫方法多載之後 Dispose() ,可能會發生回呼,因為計時器會排入執行緒集區執行緒執行的回呼佇列。 您可以使用 Dispose(WaitHandle) 方法多載,等到所有回呼都完成為止。

    計時器所執行的回呼方法應該重新進入,因為它會線上程上 ThreadPool 呼叫。 如果計時器間隔小於執行回呼所需的時間,或所有線程集區執行緒都正在使用中,且回呼已排入佇列多次,則可以在兩個執行緒集區執行緒上同時執行回呼。

    System.Threading.Timer 是使用回呼方法且由執行緒集區執行緒提供服務的簡單輕量型計時器。 不建議搭配使用 Windows Forms,因為其回呼不會發生在使用者介面執行緒上。 System.Windows.Forms.Timer是搭配使用Windows Forms的較佳選擇。 針對伺服器型計時器功能,您可以考慮使用 System.Timers.Timer 引發事件並具有其他功能。