2016-12-08 33 views
5

Muszę uruchamiać zdarzenie automatycznie co kilka minut. Wiem, że mogę to zrobić przy użyciu zdarzenia Timers.Elapsed w aplikacjach Windows Forms, jak poniżej.Odpowiednik UWP zdarzenia Timer.Elapsed

using System.Timers; 

namespace TimersDemo 
{ 
    public class Foo 
    { 
     System.Timers.Timer myTimer = new System.Timers.Timer(); 

     public void StartTimers() 
     {     
      myTimer.Interval = 1; 
      myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed); 
      myTimer.Start(); 
     } 

     void myTimer_Elapsed(object sender, EventArgs e) 
     { 
      myTimer.Stop(); 
      //Execute your repeating task here 
      myTimer.Start(); 
     } 
    } 
} 

Mam wiele razy googlowałem i próbowałem znaleźć odpowiednik w UWP.

Odpowiedz

7

Poniższy fragment kodu używający DispatcherTimer powinien zapewniać równoważną funkcjonalność, która uruchamia wywołanie zwrotne w wątku UI.

using Windows.UI.Xaml; 
public class Foo 
{ 
    DispatcherTimer dispatcherTimer; 
    public void StartTimers() 
    { 
     dispatcherTimer = new DispatcherTimer(); 
     dispatcherTimer.Tick += dispatcherTimer_Tick; 
     dispatcherTimer.Interval = new TimeSpan(0, 0, 1); 
    } 

    // callback runs on UI thread 
    void dispatcherTimer_Tick(object sender, object e) 
    { 
     // execute repeating task here 
    } 
} 

Gdy nie ma potrzeby, aby aktualizować na wątku UI i wystarczy timer, można użyć ThreadPoolTimer, tak jak

using Windows.System.Threading; 
public class Foo 
{ 
    ThreadPoolTimer timer; 

    public void StartTimers() 
    { 
     timer = ThreadPoolTimer.CreatePeriodicTimer(TimerElapsedHandler, new TimeSpan(0, 0, 1)); 
    } 

    private void TimerElapsedHandler(ThreadPoolTimer timer) 
    { 
     // execute repeating task here 
    } 
} 
+0

Wierzę, że tak, dziękuję! Chciałbym jednak poprosić o szczegółową odpowiedź dla innych czytelników, jeśli możesz. W przeciwnym razie można to uznać za odpowiedź [tylko link] (http://meta.stackexchange.com/q/8231/217907). Mimo wszystko, MSDN nigdzie się nie wybiera w najbliższym czasie, jak sądzę! –

+1

@DevrajGadhavi zauważ, że DispatcherTimer uruchamia wywołanie zwrotne w wątku UI, więc nie jest to dokładnie odpowiednik System.Timers.Timer. – Evk

+0

@Evk, może będę go potrzebował do uruchomienia w wątku interfejsu użytkownika. Jakie mogą być największe wady? Co więcej, każda inna odpowiednia alternatywa zostanie uznana jako osobna odpowiedź. –

2

Ostatnio I rozwiązać podobne zadanie, gdy potrzebowałem okresowe zdarzenia czasowe w aplikacji UWP.

Nawet jeśli używasz ThreadPoolTimer, nadal możesz wykonywać nieblokujące wywołania do interfejsu użytkownika z programu obsługi zdarzeń zegara. Można to osiągnąć za pomocą Dispatcher obiektu i wywołanie RunAsync metody tak:

TimeSpan period = TimeSpan.FromSeconds(60); 

ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((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. 
      // 

     }); 

}, period); 

Fragment kodu pochodzi z tego artykułu: Create a periodic work item.

Mam nadzieję, że będzie to pomocne.

+0

Myślę, że powinieneś edytować swoją odpowiedź i publikować niezbędne fragmenty linku. W ten sposób zaczniesz też zdobywać reputację. –

+0

Dziękuję wam za komentarze, zredagowałem moją odpowiedź zgodnie z waszymi zaleceniami. – ebontrop