Temporizadores de subprocesos (Visual C# y Visual Basic)
La clase System.Threading.Timer es útil para ejecutar periódicamente una tarea en un subproceso separado.Por ejemplo, podría utilizar un temporizador de subproceso para comprobar el estado y la integridad de una base de datos o para hacer copias de seguridad de archivos importantes.
Ejemplo de temporizador de subprocesos
El ejemplo siguiente inicia una tarea cada dos segundos y utiliza un marcador para iniciar el método Dispose, que detiene el temporizador.En este ejemplo, se expone el estado en la ventana de salida.
Private Class StateObjClass
' Used to hold parameters for calls to TimerTask.
Public SomeValue As Integer
Public TimerReference As System.Threading.Timer
Public TimerCanceled As Boolean
End Class
Public Sub RunTimer()
Dim StateObj As New StateObjClass
StateObj.TimerCanceled = False
StateObj.SomeValue = 1
Dim TimerDelegate As New System.Threading.TimerCallback(AddressOf TimerTask)
' Create a timer that calls a procedure every 2 seconds.
' Note: There is no Start method; the timer starts running as soon as
' the instance is created.
Dim TimerItem As New System.Threading.Timer(TimerDelegate, StateObj,
2000, 2000)
' Save a reference for Dispose.
StateObj.TimerReference = TimerItem
' Run for ten loops.
While StateObj.SomeValue < 10
' Wait one second.
System.Threading.Thread.Sleep(1000)
End While
' Request Dispose of the timer object.
StateObj.TimerCanceled = True
End Sub
Private Sub TimerTask(ByVal StateObj As Object)
Dim State As StateObjClass = CType(StateObj, StateObjClass)
' Use the interlocked class to increment the counter variable.
System.Threading.Interlocked.Increment(State.SomeValue)
System.Diagnostics.Debug.WriteLine("Launched new thread " & Now.ToString)
If State.TimerCanceled Then
' Dispose Requested.
State.TimerReference.Dispose()
System.Diagnostics.Debug.WriteLine("Done " & Now)
End If
End Sub
private class StateObjClass
{
// Used to hold parameters for calls to TimerTask.
public int SomeValue;
public System.Threading.Timer TimerReference;
public bool TimerCanceled;
}
public void RunTimer()
{
StateObjClass StateObj = new StateObjClass();
StateObj.TimerCanceled = false;
StateObj.SomeValue = 1;
System.Threading.TimerCallback TimerDelegate =
new System.Threading.TimerCallback(TimerTask);
// Create a timer that calls a procedure every 2 seconds.
// Note: There is no Start method; the timer starts running as soon as
// the instance is created.
System.Threading.Timer TimerItem =
new System.Threading.Timer(TimerDelegate, StateObj, 2000, 2000);
// Save a reference for Dispose.
StateObj.TimerReference = TimerItem;
// Run for ten loops.
while (StateObj.SomeValue < 10)
{
// Wait one second.
System.Threading.Thread.Sleep(1000);
}
// Request Dispose of the timer object.
StateObj.TimerCanceled = true;
}
private void TimerTask(object StateObj)
{
StateObjClass State = (StateObjClass)StateObj;
// Use the interlocked class to increment the counter variable.
System.Threading.Interlocked.Increment(ref State.SomeValue);
System.Diagnostics.Debug.WriteLine("Launched new thread " + DateTime.Now.ToString());
if (State.TimerCanceled)
// Dispose Requested.
{
State.TimerReference.Dispose();
System.Diagnostics.Debug.WriteLine("Done " + DateTime.Now.ToString());
}
}
Los temporizadores de subprocesos resultan especialmente útiles cuando el objeto System.Windows.Forms.Timer no se encentra disponible; esto ocurre, por ejemplo, cuando se desarrollan aplicaciones de consola.