Condividi tramite


DispatcherTimer Classe

Definizione

Fornisce un timer integrato nella coda dispatcher , che viene elaborato a un intervallo di tempo specificato e a una priorità specificata.

/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DispatcherTimer
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class DispatcherTimer
Public Class DispatcherTimer
Ereditarietà
Object IInspectable DispatcherTimer
Attributi

Requisiti Windows

Famiglia di dispositivi
Windows 10 (è stato introdotto in 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (è stato introdotto in v1.0)

Esempio

Questo codice di esempio implementa un semplice timer in stile console che scrive i dati in un textBlock denominato TimerLog (XAML che definisce TimerLog non viene visualizzato). Il valore Interval è impostato su 1 e il log visualizza il tempo trascorso effettivo per ogni tick.

DispatcherTimer dispatcherTimer;
DateTimeOffset startTime;
DateTimeOffset lastTime;
DateTimeOffset stopTime;
int timesTicked = 1;
int timesToTick = 10;

public void DispatcherTimerSetup()
{
    dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += dispatcherTimer_Tick;
    dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
    //IsEnabled defaults to false
    TimerLog.Text += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
    startTime = DateTimeOffset.Now;
    lastTime = startTime;
    TimerLog.Text += "Calling dispatcherTimer.Start()\n";
    dispatcherTimer.Start();
    //IsEnabled should now be true after calling start
    TimerLog.Text += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
}

void dispatcherTimer_Tick(object sender, object e)
{
    DateTimeOffset time = DateTimeOffset.Now;
    TimeSpan span = time - lastTime;
    lastTime = time;
    //Time since last tick should be very very close to Interval
    TimerLog.Text += timesTicked + "\t time since last tick: " + span.ToString() + "\n";
    timesTicked++;
    if (timesTicked > timesToTick)
    {
        stopTime = time;
        TimerLog.Text += "Calling dispatcherTimer.Stop()\n";
        dispatcherTimer.Stop();
        //IsEnabled should now be false after calling stop
        TimerLog.Text += "dispatcherTimer.IsEnabled = " + dispatcherTimer.IsEnabled + "\n";
        span = stopTime - startTime;
        TimerLog.Text += "Total Time Start-Stop: " + span.ToString() + "\n";
    }
}
private void Page_Loaded_1(object sender, RoutedEventArgs e)
{
    DispatcherTimerSetup();
}
// MainPage.cpp
...
#include <chrono>
...
void MainPage::StartTimerAndRegisterHandler()
{
    Windows::UI::Xaml::DispatcherTimer timer;
    timer.Interval(std::chrono::milliseconds{ 500 });
    auto registrationtoken = timer.Tick({this, &MainPage::OnTick });
    timer.Start();
}

void MainPage::OnTick(Windows::Foundation::IInspectable const& /* sender */,
    Windows::Foundation::IInspectable const& /* e */)
{
    // do something on each tick here ...
}
// .cpp definition, .h not shown
void MainPage::StartTimerAndRegisterHandler() {
    auto timer = ref new Windows::UI::Xaml::DispatcherTimer();
    TimeSpan ts;
    ts.Duration = 500;
    timer->Interval = ts;
    timer->Start();
    auto registrationtoken = timer->Tick += ref new EventHandler<Object^>(this,&MainPage::OnTick);
}
void MainPage::OnTick(Object^ sender, Object^ e) {
    // do something on each tick here ...
}

Commenti

DispatcherTimer può essere usato per eseguire il codice nello stesso thread che produce il thread dell'interfaccia utente. Il codice in esecuzione in questo thread ha il privilegio di creare e modificare oggetti che possono essere creati e modificati solo nel thread dell'interfaccia utente. Per specificare che il codice deve essere eseguito nel thread dell'interfaccia utente, impostare la proprietà Interval e quindi chiamare il metodo Start . L'evento Tick viene generato dopo che è trascorso il tempo specificato in Interval . Il segno di graduazione continua a essere attivato allo stesso intervallo fino a quando non viene chiamato il metodo Stop , l'app termina o l'app viene sospesa (viene attivata la sospensione).

Uno scenario per DispatcherTimer consiste nel controllare le proprietà nei sensori in cui le modifiche ai valori del sensore non sono puramente basate su eventi o gli eventi non offrono la granularità desiderata. È possibile vederlo nell'esempio di Accelerometro.

Altri scenari per DispatcherTimer includono il controllo delle modifiche dello stato che non hanno eventi correlati o per gli aggiornamenti periodici dell'interfaccia utente che non possono usare un'animazione con storyboard o un'associazione bidirezionale.

Suggerimento

Se si esegue la migrazione di codice Microsoft Silverlight o Windows Presentation Foundation (WPF), DispatcherTimer e dispatcher correlato si trovavano in uno spazio dei nomi System.Windows.Threading separato. Non esiste alcuno spazio dei nomi Windows.UI.Xaml.Threading nel Windows Runtime, quindi questa classe si trova in Windows.UI.Xaml.

Se non si esegue alcuna operazione con il thread dell'interfaccia utente nei gestori tick e basta un timer, è anche possibile usare ThreadPoolTimer . Inoltre, per tecniche come ThreadPoolTimer o un'attività .NET, non si è completamente isolati dal thread dell'interfaccia utente. È comunque possibile assegnare al thread dell'interfaccia utente in modo asincrono usando CoreDispatcher.RunAsync.

Costruttori

DispatcherTimer()

Inizializza una nuova istanza della classe DispatcherTimer .

Proprietà

Interval

Ottiene o imposta la quantità di tempo tra i tick del timer.

IsEnabled

Ottiene un valore che indica se il timer è in esecuzione.

Metodi

Start()

Avvia DispatcherTimer.

Stop()

Arresta DispatcherTimer.

Eventi

Tick

Si verifica al termine dell'intervallo del timer.

Si applica a

Vedi anche