2015-12-14 13 views
12

Sto lavorando a un progetto MVVM UWP e vorrei implementare un sistema di disconnessione automatica se l'interazione dell'utente si interrompe per un tempo specifico.
Fino ad ora sto utilizzando uno DispatcherTimer per contare all'indietro da 200 ogni secondo.Timer nell'app UWP che non è collegata all'interfaccia utente

TimerLeave = 200; 
var _dispatcherTimer = new DispatcherTimer(); 
_dispatcherTimer.Tick += dispatcherTimer_Tick; 
_dispatcherTimer.Interval = new TimeSpan(0, 0, 1); 

_dispatcherTimer.Start(); 

Ma perché il DispatcherTimer è collegata con l'interfaccia utente e sto costruendo un App MVVM, sto cercando un'alternativa.
Ho cercato un po 'e ho trovato Run a background task on a timer. Il problema è che questo timer può essere impostato solo per essere eseguito ogni 15 minuti, il che è un po 'troppo lungo per disconnettere automaticamente un utente nel mio caso. Non ho trovato soluzioni per ridurre i 15 minuti.
Quindi la mia domanda è, c'è qualche possibilità di impostare un timer in un progetto UWP che non è collegato all'interfaccia utente e può essere impostato variabile?

+1

hai controllato questo: [collegamento] (http://stackoverflow.com/questions/1416803/system-timers-timer-vs-system-threading-timer)? –

+1

@AntonioUgraalBarile Ho perso totalmente System.Threading.Timer, grazie per questo suggerimento. Ho trovato System.Timer e questo non è supportato nelle app UWP. – croxy

risposta

15

Sì, è possibile ad esempio utilizzare Timer class, anche se è necessario ricordare che viene eseguito su un thread separato. Esempio:

private Timer timer; 
public MainPage() 
{   
    this.InitializeComponent(); 
    timer = new Timer(timerCallback, null, (int)TimeSpan.FromMinutes(1).TotalMilliseconds, Timeout.Infinite); 
} 

private async void timerCallback(object state) 
{ 
    // do some work not connected with UI 

    await Window.Current.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, 
     () => { 
      // do some work on UI here; 
     }); 
} 

Nota che il lavoro inviato su UI dispatcher non possono essere trattati subito - Dipende carico di lavoro del dispatcher.

Ricorda inoltre che questo timer viene eseguito insieme alla tua app e non funzionerà quando l'app è sospesa.

+0

Risposta perfetta! –

+0

Questo ha generato un'eccezione di riferimento null, mentre https://stackoverflow.com/a/27698035/118153 ha funzionato per me. – Iiridayn

+0

@Iiridayn È solo un modo per ottenere il dispatcher, potresti anche ottenerlo in modi diversi. È solo questione di essere sicuro di poterlo accedere. – Romasz

7

Ho risolto il problema recentemente utilizzando una classe ThreadPoolTimer.

ThreadPoolTimer timer = ThreadPoolTimer.CreatePeriodicTimer((t) => 
     { 
      //do some work \ dispatch to UI thread as needed 
     }, TimeSpan.FromMinutes(1)); 

Allo stato attuale non sono a conoscenza di alcun vantaggio di questa soluzione sul timer già postato, ma ha funzionato bene.

+0

Testato entrambe le soluzioni. ThreadPoolTimer è più preciso di Timer. Lo userà. –