1.DispatcherTimer定时器不是单独开启一个线程来运行定时器方法,而是和主线程是同一个线程,只是通过改变运行优先级来实现定时器,当定时器时间到了,主线程就转去执行定时器方法。因此DispatcherTimer定时器不要用来实现执行时间长的任务,不然会使主线程很卡,导致WPF界面很看,是用不友好!
2.DispatcherTimer定时器第一次执行是先等待指定周期的时间再执行定时器方法,而不是先执行再计时;然后,执行完定时器方法后,再等待指定周期的时间。如:如执行周期T = 5s, 定时器方法内的代码所需执行时间为R = 4s;当启动定时器时:先等待5s,然后执行定时器方法(所需时间4s),然后再等待5s,再执行定时器方法(所需时间4s).........
3.测试程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Diagnostics;
namespace 定时器原理验证
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
//定时器
private DispatcherTimer mDataTimer = null;
//定时器执行次数
private long timerExeCount = 0;
public MainWindow()
{
InitializeComponent();
InitTimer();
}
private void InitTimer()
{
if (mDataTimer == null)
{
mDataTimer = new DispatcherTimer();
mDataTimer.Tick += new EventHandler(DataTimer_Tick);
mDataTimer.Interval = TimeSpan.FromSeconds(5);
}
}
private void DataTimer_Tick(object sender, EventArgs e)
{
s2 = DateTime.Now;
TimeSpan s = s2 - s1;
Debug.WriteLine("==========定时器第 " + timerExeCount + " 次执行, 耗时:" + s.TotalMilliseconds + "=========");
Debug.WriteLine("++++++++++开始休眠第 " + timerExeCount + " 次执行+++++++++");
s1 = DateTime.Now;
//System.Threading.Thread.Sleep(2000);
for (int i = 0; i < 400; ++i)
{
System.Threading.Thread.Sleep(10);
}
s2 = DateTime.Now;
TimeSpan t = s2 - s1;
Debug.WriteLine("----------结束休眠第 " + timerExeCount + " 次执行, 耗时:" + t.TotalMilliseconds + "---------");
s1 = DateTime.Now;
++timerExeCount;
}
DateTime s1;
DateTime s2;
public void StartTimer()
{
if (mDataTimer != null && mDataTimer.IsEnabled == false)
{
mDataTimer.Start();
s1 = DateTime.Now;
}
}
public void StopTimer()
{
if (mDataTimer != null && mDataTimer.IsEnabled == true)
{
mDataTimer.Stop();
}
}
private void btnStartTimer_Click(object sender, RoutedEventArgs e)
{
StartTimer();
}
private void btnStopTimer_Click(object sender, RoutedEventArgs e)
{
mDataTimer.Stop();
}
}
}