2016-12-08 11 views
5

数分ごとに自動的にイベントを発生させる必要があります。私は、以下のようにWindowsフォームアプリケーションでTimers.Elapsedイベントを使用してこれを行うことができることを知っています。Timer.ElapsedイベントのUWP相当

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を使用する次のコードスニペットは、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 
    } 
} 

がUIスレッド上で更新する必要はありませんし、あなただけのタイマーを必要とするとき、あなたは私が必要なときに最近

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

はい、ありがとうございます!しかし、私はあなたができるならば、他の読者のために、詳細な答えを要求するでしょう。それ以外の場合は、[リンクのみ](http://meta.stackexchange.com/q/8231/217907)の回答と見なすことができます。でも、MSDNはいつでもすぐにどこにも行かない、と私は信じている! –

+1

@DevrajGadhaviは、DispatcherTimerはUIスレッドでコールバックを実行するので、System.Timers.Timerと正確には同じではないことに注意してください。 – Evk

+0

@Evk、実際にはUIスレッドで実行する必要があります。そうすることの大きな欠点は何でしょうか?さらに、他の適切な代替案は、別個の回答として認識されるであろう。 –

2

私は、同様のタスクを解くように、ThreadPoolTimerを使用することができますUWPアプリケーションの定期タイマーイベント。

ThreadPoolTimerを使用しても、タイマーイベントハンドラからUIへの非ブロッキング呼び出しを行うことができます。 Create a periodic work item:コードスニペットは、この資料から取得され

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

: それはディスパッチャオブジェクトを使用してこのようなそのRunAsyncメソッドを呼び出すことによって達成することができます。

私はそれが役に立ちそうです。

+0

あなたはあなたの答えを編集し、リンクから抜粋してください。あなたはまた、いくつかの評判を得ることになるでしょう。 –

+0

あなたのコメントをありがとう、私はあなたの推奨に従って私の答えを編集しました。 – ebontrop

関連する問題