Timer(System.Timers)とDispatcherTimer

4090 ワード

Timerコンポーネントは,サーバベースのタイマであり,間隔Intervalを設定することにより,Elapsedイベントを周期的にトリガする.
使用法は次のとおりです.
    class Program {
static System.Timers.Timer Timer1 = new System.Timers.Timer();
static void Main() {
Timer1.Interval = 1000;
Timer1.Elapsed += new ElapsedEventHandler(PeriodicTaskHandler);
Timer1.Start();
Console.ReadLine();
}

static void PeriodicTaskHandler(object sender, ElapsedEventArgs e) {
string str =Thread.CurrentThread.ManagedThreadId.ToString()+"##" +"Timer1" +"##" + e.SignalTime.ToLongTimeString();
Console.WriteLine(str);
}
}

 
DispatcherTimer:Dispatcherキュー内のタイマは、設定した時間間隔が発生した時点でタイマを実行する保証はありませんが、時間間隔が発生する前にタイマを実行しない保証があります.これは、DispatcherTimerの操作もDispatcherキューに配置されているためです.DispatcherTimerの操作を実行するタイミングは、キュー内の他のジョブとその優先度に依存します.
WPFアプリケーションで
TimerのElapsedイベントバインドの方法はUIスレッド上で実行されていません.UIスレッド上のオブジェクトにアクセスするには、InvokeまたはBeginInvokeを使用してUIスレッドのDispatcherに操作をパブリッシュする必要があります.
使い方は以下の通り
private void Button_Click(object sender, RoutedEventArgs e) {
Timer timer = new Timer();
timer.Interval = 1000;
timer.Start();
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

}

void timer_Elapsed(object sender, ElapsedEventArgs e) {
i++;
this.Dispatcher.Invoke(new Action(() => {
test.Content = i.ToString();
}));
}

private int i = 0;

 
DispatcherTimerとDispatcherは同じスレッドで動作し、DispatcherTimerでDispatcherPriorityを設定できます.
使用法
private void Button_Click(object sender, RoutedEventArgs e) {
timer.Interval = TimeSpan.FromMilliseconds(1000);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}

void timer_Tick(object sender, EventArgs e) {
i++;
Test.Content = i.ToString();
}

private int i = 0;
private DispatcherTimer timer = new DispatcherTimer();

詳細コード:DownLoad