2016-12-08 6 views
5

Мне нужно активировать событие автоматически каждые несколько минут. Я знаю, что могу сделать это, используя Timers.Elapsed событие в приложениях Windows Forms, как показано ниже.UWP-эквивалент Timer.Elapsed event

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

Я гугле много и изо всех сил, чтобы найти то, что является эквивалентом этого в UWP.

ответ

7

Следующий фрагмент кода с использованием DispatcherTimer должен обеспечивать эквивалентную функциональность, которая выполняет обратный вызов в потоке пользовательского интерфейса.

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

Когда нет необходимости обновлять в потоке пользовательского интерфейса и вам просто нужно таймер, вы можете использовать ThreadPoolTimer, как и

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

Я верю, да, спасибо! Однако я бы попросил подробный ответ для других читателей, если можно. В противном случае это можно рассматривать как ответ [link only] (http://meta.stackexchange.com/q/8231/217907). Хотя, MSDN не собирается никуда в ближайшее время, я верю! –

+1

@DevrajGadhavi отмечает, что DispatcherTimer запускает обратный вызов в потоке пользовательского интерфейса, поэтому он не совсем эквивалентен System.Timers.Timer. – Evk

+0

@Evk, мне действительно может понадобиться его запустить в потоке пользовательского интерфейса. Что может быть основными недостатками в этом? Более того, любая другая подходящая альтернатива будет оценена как отдельный ответ. –

2

Недавно я решал подобную задачу, когда мне нужно было периодические события таймера в приложении UWP.

Даже вы используете ThreadPoolTimer, вы все еще можете сделать неблокирующий вызов для пользовательского интерфейса из обработчика события таймера. Это может быть достигнуто с помощью диспетчера объекта и вызова его RunAsync метод, как это:

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

фрагмент кода взят из этой статьи: Create a periodic work item.

Надеюсь, это будет полезно.

+0

Я думаю, вы должны отредактировать свой ответ и опубликовать существенные выдержки из ссылки. Таким образом, вы также начнете получать некоторую репутацию. –

+0

Спасибо, ребята, за ваши комментарии, я отредактировал свой ответ в соответствии с вашими рекомендациями. – ebontrop