Timer Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Fornisce un meccanismo per l'esecuzione di un metodo in un thread del pool di thread a intervalli specificati. La classe non può essere ereditata.
public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, IDisposable
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
interface IDisposable
type Timer = class
inherit MarshalByRefObject
interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
inherit MarshalByRefObject
interface IDisposable
type Timer = class
inherit MarshalByRefObject
interface IAsyncDisposable
interface IDisposable
Public NotInheritable Class Timer
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
- Ereditarietà
-
Timer
- Ereditarietà
- Attributi
- Implementazioni
Esempio
Nell'esempio seguente viene definita una StatusChecker classe che include un CheckStatus metodo la cui firma è uguale al TimerCallback delegato. L'argomento state del CheckStatus metodo è un AutoResetEvent oggetto utilizzato per sincronizzare il thread dell'applicazione e il thread del pool di thread che esegue il delegato di callback. La StatusChecker classe include anche due variabili di stato:
invokeCount
Indica il numero di volte in cui il metodo di callback è stato richiamato.
maxCount
Determina il numero massimo di volte in cui deve essere richiamato il metodo di callback.
Il thread applicazione crea il timer, che attende un secondo e quindi esegue il CheckStatus metodo di callback ogni 250 millisecondi. Il thread dell'applicazione si blocca quindi fino a quando l'oggetto AutoResetEvent non viene segnalato. Quando viene eseguito maxCount il CheckStatus metodo di callback, chiama il AutoResetEvent.Set metodo per impostare lo stato dell'oggetto AutoResetEvent su segnalato. La prima volta che si verifica questo problema, il thread dell'applicazione chiama il Change(Int32, Int32) metodo in modo che il metodo di callback venga eseguito ogni mezzo secondo. Si blocca ancora una volta fino a quando l'oggetto AutoResetEvent non viene segnalato. In questo caso, il timer viene eliminato definitivamente chiamando il relativo Dispose metodo e l'applicazione termina.
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.
Commenti
Usare un TimerCallback delegato per specificare il metodo da Timer eseguire. La firma del TimerCallback delegato è:
void TimerCallback(Object state)
Sub TimerCallback(state As Object)
Il delegato timer viene specificato quando il timer viene costruito e non può essere modificato. Il metodo non viene eseguito sul thread che ha creato il timer; viene eseguito su un ThreadPool thread fornito dal sistema.
Tip
.NET include diverse classi timer, ognuna delle quali offre funzionalità diverse:
- System.Timers.Timer, che genera un evento ed esegue il codice in uno o più sink di eventi a intervalli regolari. La classe è destinata all'uso come componente basato su server o di servizio in un ambiente multithreading; non ha un'interfaccia utente e non è visibile in fase di esecuzione.
- System.Threading.Timer, che esegue un singolo metodo di callback su un thread del pool di thread a intervalli regolari. Il metodo di callback viene definito quando viene creata un'istanza del timer e non può essere modificato. Analogamente alla System.Timers.Timer classe , questa classe è destinata all'uso come componente basato su server o di servizio in un ambiente multithreading. Non dispone di interfaccia utente e non è visibile in fase di esecuzione.
- System.Windows.Forms.Timer, un componente Windows Forms che genera un evento ed esegue il codice in uno o più sink di eventi a intervalli regolari. Il componente non ha interfaccia utente ed è progettato per l'uso in un ambiente a thread singolo; viene eseguito nel thread dell'interfaccia utente.
- System.Web.UI.Timer (solo .NET Framework), un componente ASP.NET che esegue postback di pagine Web asincrone o sincrone a intervalli regolari.
-
System.Windows.Threading.DispatcherTimer, un timer integrato nella coda
Dispatcher. Questo timer viene elaborato con una priorità specificata a un intervallo di tempo specificato.
Quando si crea un timer, è possibile specificare una quantità di tempo di attesa prima della prima esecuzione del metodo (tempo di scadenza) e un intervallo di tempo di attesa tra le esecuzioni successive (periodo). La Timer classe ha la stessa risoluzione dell'orologio di sistema. Ciò significa che se il punto è minore della risoluzione dell'orologio di sistema, il delegato TimerCallback verrà eseguito a intervalli definiti dalla risoluzione dell'orologio di sistema, ovvero circa 15 millisecondi su Windows 7 e Windows 8 sistemi. È possibile modificare il tempo e il periodo di scadenza oppure disabilitare il timer usando il Change metodo .
Note
Finché si usa un oggetto Timer, è necessario mantenere un riferimento a esso. Come per qualsiasi oggetto gestito, un Timer oggetto è soggetto a Garbage Collection quando non vi sono riferimenti. Il fatto che un oggetto Timer sia ancora attivo non impedisce la raccolta.
Note
L'orologio di sistema usato è lo stesso orologio usato da GetTickCount, che non è interessato dalle modifiche apportate con timeBeginPeriod e timeEndPeriod.
Quando un timer non è più necessario, usare il Dispose metodo per liberare le risorse mantenute dal timer. Si noti che i callback possono verificarsi dopo che è stato chiamato l'overload del Dispose() metodo, perché il callback delle code timer per l'esecuzione da parte dei thread del pool di thread. È possibile usare l'overload del Dispose(WaitHandle) metodo per attendere il completamento di tutti i callback.
Il metodo di callback eseguito dal timer deve essere reentrant, perché viene chiamato sui ThreadPool thread. Il callback può essere eseguito contemporaneamente su due thread del pool di thread se l'intervallo timer è inferiore al tempo necessario per eseguire il callback oppure se tutti i thread del pool di thread sono in uso e il callback viene accodato più volte.
Note
System.Threading.Timer è un timer semplice e leggero che usa metodi di callback e viene gestito dai thread del pool di thread. Non è consigliabile usare con Windows Forms, perché i relativi callback non si verificano nel thread dell'interfaccia utente. System.Windows.Forms.Timer è una scelta migliore da usare con Windows Forms. Per la funzionalità timer basata su server, è possibile prendere in considerazione l'uso System.Timers.Timerdi , che genera eventi e include funzionalità aggiuntive.
Costruttori
| Nome | Descrizione |
|---|---|
| Timer(TimerCallback, Object, Int32, Int32) |
Inizializza una nuova istanza della |
| Timer(TimerCallback, Object, Int64, Int64) |
Inizializza una nuova istanza della |
| Timer(TimerCallback, Object, TimeSpan, TimeSpan) |
Inizializza una nuova istanza della |
| Timer(TimerCallback, Object, UInt32, UInt32) |
Inizializza una nuova istanza della |
| Timer(TimerCallback) |
Inizializza una nuova istanza della Timer classe con un periodo infinito e un tempo di scadenza infinito, utilizzando l'oggetto appena creato Timer come oggetto di stato. |
Metodi
| Nome | Descrizione |
|---|---|
| Change(Int32, Int32) |
Modifica l'ora di inizio e l'intervallo tra le chiamate al metodo per un timer, usando interi con segno a 32 bit per misurare gli intervalli di tempo. |
| Change(Int64, Int64) |
Modifica l'ora di inizio e l'intervallo tra le chiamate al metodo per un timer, usando interi con segno a 64 bit per misurare gli intervalli di tempo. |
| Change(TimeSpan, TimeSpan) |
Modifica l'ora di inizio e l'intervallo tra le chiamate al metodo per un timer, usando TimeSpan i valori per misurare gli intervalli di tempo. |
| Change(UInt32, UInt32) |
Modifica l'ora di inizio e l'intervallo tra le chiamate al metodo per un timer, usando interi senza segno a 32 bit per misurare gli intervalli di tempo. |
| CreateObjRef(Type) |
Crea un oggetto che contiene tutte le informazioni pertinenti necessarie per generare un proxy utilizzato per comunicare con un oggetto remoto. (Ereditato da MarshalByRefObject) |
| Dispose() |
Rilascia tutte le risorse usate dall'istanza corrente di Timer. |
| Dispose(WaitHandle) |
Rilascia tutte le risorse usate dall'istanza corrente di Timer e segnala quando il timer è stato eliminato. |
| DisposeAsync() |
Rilascia tutte le risorse usate dall'istanza corrente di Timer. |
| Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
| Finalize() |
Consente a un oggetto di provare a liberare risorse ed eseguire altre operazioni di pulizia prima che venga recuperata da Garbage Collection. |
| GetHashCode() |
Funge da funzione hash predefinita. (Ereditato da Object) |
| GetLifetimeService() |
Recupera l'oggetto servizio di durata corrente che controlla i criteri di durata per questa istanza. (Ereditato da MarshalByRefObject) |
| GetType() |
Ottiene il Type dell'istanza corrente. (Ereditato da Object) |
| InitializeLifetimeService() |
Ottiene un oggetto servizio di durata per controllare i criteri di durata per questa istanza. (Ereditato da MarshalByRefObject) |
| MemberwiseClone() |
Crea una copia superficiale del Objectcorrente. (Ereditato da Object) |
| MemberwiseClone(Boolean) |
Crea una copia superficiale dell'oggetto corrente MarshalByRefObject . (Ereditato da MarshalByRefObject) |
| ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
Metodi di estensione
| Nome | Descrizione |
|---|---|
| ConfigureAwait(IAsyncDisposable, Boolean) |
Configura il modo in cui verranno eseguite le attese nelle attività restituite da un oggetto eliminabile asincrono. |
Si applica a
Thread safety
Questo tipo è thread-safe.