Timer(System.Timers) 和 DispatcherTimer

转载 2012年03月24日 12:36:36

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

实例对比WPF中的Timer和DispatcherTimer

本文使用Timer和DispatcherTimer制作电子时钟,通过实例对比来了解两者的本质区别。 下面是实例最终的运行画面。其中时钟1使用Timer实现,时钟2使用DispatcherTimer实...
  • tiana0
  • tiana0
  • 2016年05月08日 16:35
  • 8257

c# 计时器 DispatcherTimer类

DispatcherTimer 类 计时器 DispatcherTimer.Interval 属性 设置时间间隔 public TimeSpan Interval { get; set; } ...
  • i1tws
  • i1tws
  • 2017年03月01日 18:30
  • 123

wp下使用Timer 还是DispatcherTimer?

DispatcherTimer属于UI线程,Timer非UI线程,运行在后台。  DispatcherTimer里面执行等待动作或者时间过长,可能会导致UI假死。 但是 Timer的 ...
  • lwcbest
  • lwcbest
  • 2014年07月24日 17:22
  • 522

wpf中应该使用c#四种定时器中的DispatcherTimer

c#中有四种定时器 1:System.Threading.Timer 使用:private System.Threading.Timer timerClose; timerClose = new...
  • aiyongyyy
  • aiyongyyy
  • 2016年06月14日 13:09
  • 12878

WPF中DispatcherTimer定时器的原理

1.DispatcherTimer定时器不是单独开启一个线程来运行定时器方法,而是和主线程是同一个线程,只是通过改变运行优先级来实现定时器,当定时器时间到了,主线程就转去执行定时器方法。因此Dispa...
  • u010223730
  • u010223730
  • 2013年08月25日 09:37
  • 5421

C# 子窗口关闭时在其内定义的Timer释放

在WPF编程的时候,在主窗体中ShowDialog一个子窗体,在其内定义了System.Windows.Threading.DispatcherTimer和System.Timers.Timer两种计...
  • XueminXu
  • XueminXu
  • 2013年11月09日 17:06
  • 1447

System.Timers.Timer和System.Windows.Forms.Timer区别-测试笔记

System.Timers.Timer和System.Windows.Forms.Timer是有区别的。 我一个是非堵塞的,一个不是。更重要的的System.Timer是多线程的,如果控制不好执行时...
  • wlanye
  • wlanye
  • 2014年03月14日 11:37
  • 1804

WPF下DispatcherTimer问题

下面本来是要发在CSDN论坛里的问题,可视后来发现问题自己解决了,但是通过多次尝试,并没有重现问题,所以暂时把问题发这里,待后面再寻找问题所在。 ###问题### WPF下DispatcherTime...
  • washingto
  • washingto
  • 2010年11月15日 17:25
  • 5570

C#中System.Timers.Timer定时器的elapsed函数传递参数

笔者最近在使用System.Timers.Timer类时,对于如何在Elapsed事件触发时向事件处理函数传递参数存在一些疑惑,后来总算解决了相关问题。总结如下: 1.匿名函数传递 使用L...
  • shellykenan
  • shellykenan
  • 2016年09月13日 19:45
  • 3685

例说多线程定时器System.Timers.Timer

System.Timers.Timer是多线程定时器,如果一个Timer没有处理完成,到达下一个时间点,新的Timer同样会被启动,所以在使用Timer时需要注意。下面的实例显示了Timer的使用方法...
  • tiana0
  • tiana0
  • 2016年05月08日 17:07
  • 10646
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Timer(System.Timers) 和 DispatcherTimer
举报原因:
原因补充:

(最多只允许输入30个字)