Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las APIs importantes
Aprenda a crear un elemento de trabajo que se ejecute después de que transcurre un temporizador.
Creación de un temporizador de un solo disparo
Use el método createTimer para crear un temporizador para el elemento de trabajo. Proporcione una expresión lambda que realice el trabajo y use el parámetro delay para especificar cuánto tiempo espera el grupo de subprocesos para poder asignar el elemento de trabajo a un subproceso disponible. El retraso se especifica mediante una estructura TimeSpan.
Nota Puede usar CoreDispatcher.RunAsync para acceder a la interfaz de usuario y mostrar el progreso desde el elemento de trabajo.
En el ejemplo siguiente se crea un elemento de trabajo que se ejecuta en tres minutos:
TimeSpan delay = TimeSpan.FromMinutes(3);
ThreadPoolTimer DelayTimer = ThreadPoolTimer.CreateTimer(
(source) =>
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher.RunAsync(
CoreDispatcherPriority.High,
() =>
{
//
// UI components can be accessed within this scope.
//
});
}, delay);
TimeSpan delay;
delay.Duration = 3 * 60 * 10000000; // 10,000,000 ticks per second
ThreadPoolTimer ^ DelayTimer = ThreadPoolTimer::CreateTimer(
ref new TimerElapsedHandler([this](ThreadPoolTimer^ source)
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher->RunAsync(CoreDispatcherPriority::High,
ref new DispatchedHandler([this]()
{
//
// UI components can be accessed within this scope.
//
ExampleUIUpdateMethod("Timer completed.");
}));
}), delay);
Proporcionar un controlador de finalización
De ser necesario, gestione la cancelación y la finalización del elemento de trabajo con un TimerDestroyedHandler. Utilice la sobrecarga CreateTimer para proporcionar una expresión lambda adicional. Esto se ejecuta cuando se cancela el temporizador o cuando se completa el elemento de trabajo.
En el ejemplo siguiente se crea un temporizador que envía el elemento de trabajo y se llama a un método cuando finaliza el elemento de trabajo o se cancela el temporizador:
TimeSpan delay = TimeSpan.FromMinutes(3);
bool completed = false;
ThreadPoolTimer DelayTimer = ThreadPoolTimer.CreateTimer(
(source) =>
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher.RunAsync(
CoreDispatcherPriority.High,
() =>
{
//
// UI components can be accessed within this scope.
//
});
completed = true;
},
delay,
(source) =>
{
//
// TODO: Handle work cancellation/completion.
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher.RunAsync(
CoreDispatcherPriority.High,
() =>
{
//
// UI components can be accessed within this scope.
//
if (completed)
{
// Timer completed.
}
else
{
// Timer cancelled.
}
});
});
TimeSpan delay;
delay.Duration = 3 * 60 * 10000000; // 10,000,000 ticks per second
completed = false;
ThreadPoolTimer ^ DelayTimer = ThreadPoolTimer::CreateTimer(
ref new TimerElapsedHandler([&](ThreadPoolTimer ^ source)
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher->RunAsync(CoreDispatcherPriority::High,
ref new DispatchedHandler([&]()
{
//
// UI components can be accessed within this scope.
//
}));
completed = true;
}),
delay,
ref new TimerDestroyedHandler([&](ThreadPoolTimer ^ source)
{
//
// TODO: Handle work cancellation/completion.
//
Dispatcher->RunAsync(CoreDispatcherPriority::High,
ref new DispatchedHandler([&]()
{
//
// Update the UI thread by using the UI core dispatcher.
//
if (completed)
{
// Timer completed.
}
else
{
// Timer cancelled.
}
}));
}));
Cancelar el temporizador
Si el temporizador sigue contando, pero el elemento de trabajo ya no es necesario, llame a Cancelar. El temporizador se cancela y el elemento de trabajo no se enviará al grupo de subprocesos.
DelayTimer.Cancel();
DelayTimer->Cancel();
Observaciones
Las aplicaciones de la Plataforma universal de Windows (UWP) no pueden usar Thread.Sleep porque puede bloquear el subproceso de la interfaz de usuario. Puede usar un ThreadPoolTimer para crear un elemento de trabajo en su lugar, y esto retrasará la tarea realizada por el elemento de trabajo sin bloquear el subproceso de la interfaz de usuario.
Consulte el de ejemplo del grupo de subprocesos de
Para obtener información sobre los temporizadores periódicos, consulte Crear un elemento de trabajo periódico.
Temas relacionados
- Enviar un elemento de trabajo al grupo de hilos
- Mejores prácticas para usar el grupo de hilos
- Usar un temporizador para enviar un elemento de trabajo