2015-12-14 20 views
12

Bir UWP MVVM projesi üzerinde çalışıyorum ve kullanıcı etkileşimi belirli bir süre için durursa otomatik çıkış sistemini uygulamak istiyorum.
Şimdiye kadar her saniye 200'den geriye doğru saymak için DispatcherTimer kullanıyorum. UWP App uygulamasına bağlı olmayan UWP Uygulamasında Zamanlayıcı

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

_dispatcherTimer.Start(); 

Ama DispatcherTimer UI ile bağlantılıdır ve bir MVVM App inşa ediyorum çünkü

, ben bir alternatif arıyorum.
Biraz arandı ve Run a background task on a timer bulundu. Sorun, şeklindedir, bu zamanlayıcı her 15 dakikada bir çalışacak şekilde ayarlanabilir, bu da benim durumumdaki bir kullanıcının otomatik olarak kapatılması için çok uzun bir süredir. 15 dakikayı azaltmak için bir çözüm buldum.
Benim sorum şu ki, UI'ye bağlı olmayan ve değişken olarak ayarlanabilen bir UWP Projesinde bir zamanlayıcı kurma olasılığı var mıdır?

+1

bunu kontrol ettiniz mi: [link] (http://stackoverflow.com/questions/1416803/system-timers-timer-vs-system-threading-timer)? –

+1

@AntonioUgraalBarile Ben tamamen System.Threading.Timer özledim, bu ipucu için teşekkür ederim. Ben sadece System.Timer buldum ve bu UWP Apps'ta desteklenmiyor. – croxy

cevap

15

Evet - örneğin Timer class kullanın - ayrı bir iş parçacığında çalıştığını hatırlamanız gerekir. Örnek: iş UI memuru üzerinde sevk o

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; 
     }); 
} 

Not hemen işleme alınamayabilir - bu memurunun iş yüküne bağlıdır.

Ayrıca, bu zamanlayıcının uygulamanızla birlikte çalıştığını ve uygulama askıya alındığında çalışmayacağını unutmayın.

+0

Mükemmel cevap! –

+0

Bu, https://stackoverflow.com/a/27698035/118153 benim için çalıştığı sırada boş bir referans istisnası attı. – Iiridayn

+0

@Iiridayn Sadece dağıtıcı almanın bir yolu, aynı zamanda farklı yollar da alabilirsiniz. Sadece ona erişebildiğinden emin olmanın bir meselesi. – Romasz

7

Son zamanlarda bu sorunu bir ThreadPoolTimer sınıfı kullanarak çözdüm. Şu anda

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

Ben Zamanlayıcı çözümü zaten yayınlanmıştır üzerinden bu herhangi avantajın farkında değilim, ama iyi işlemiştir.

+0

Her iki çözüm de test edildi.ThreadPoolTimer, Timer'den daha doğru. Kullanacak. –