一定間隔で処理を行う場面ではTimerに処理を移譲することを考えることがあると思います。
ここで2つのTimerが見つかりました。
DispatcherTimerはUIをブロックする。
(名前空間System.Windows.Threading;)
TimerはUIをブロックしない。
(名前空間System.Timers;)
メッセージボックスを出してみる処理を作るとわかりやすいと思いました。
DisptcherTimertはUIスレッドで同期的に処理をするがTimerは別スレッドで非同期的に処理を行っていると言えると思います。
1.DispatcherTimerを使う
using System;
using System.Windows;
using System.Windows.Threading;
namespace TimerSample
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
DispatcherTimer MyDispatcherTimer;
public MainWindow()
{
InitializeComponent();
MyDispatcherTimer = new DispatcherTimer();
MyDispatcherTimer.Tick += Timer_Tick;
MyDispatcherTimer.Interval = TimeSpan.FromSeconds(1);
MyDispatcherTimer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
MessageBox.Show(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
}
}
}
2.Timerを使う
using System;
using System.Timers;
using System.Windows;
namespace UIをブロックしないTimer
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
Timer MyTimer;
public MainWindow()
{
InitializeComponent();
MyTimer = new Timer();
MyTimer.Elapsed += MyTimer_Elapsed;
MyTimer.Interval = 1000;
MyTimer.Start();
}
private void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
{
MessageBox.Show(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
}
}
}