2009-06-23日上午的时候,查看同事的wpf程序性,使用了一个dispatcherTimer ,好像自己没有使用过,因此,查看了下msdn的介绍,然后,自己在寻找了下下其他的timer类的相关知识,主要表现在 如下几个timer类:

1:System.Timers命名空间

2:System.Threading命名空间

3:System.Windows.Forms命名空间

 

如下的文字,全部从msdn帮助文档上截取,放到此处,避免以后查MSDN查不到。。。

ms-help://MS.MSDNQTR.v90.chs/dv_fxradcomp/html/adc0bc0a-a519-4812-bafc-fb9d1a5801fc.htm

 

服务器计时器、Windows 计时器和线程计时器

Visual Studio 和 .NET Framework 中包含三个计时器控件:

  • 可添加到“工具箱”中的基于服务器的计时器

  • 始终位于“工具箱”中的基于 Windows 的计时器

  • 可通过编程方式使用的线程计时器

基于 Windows 的计时器针对在 Windows 窗体应用程序中使用而进行了优化。基于服务器的计时器是传统的计时器为了在服务器环境上运行而优化后的更新版本。线程计时器是一种简单的、轻量级计时器,它使用回调方法而不是使用事件,并由线程池线程提供支持。

在 Win32 体系结构中有两种类型的线程:UI 线程和辅助线程。UI 线程绝大多数时间处于空闲状态,等待消息循环中的消息到来。一旦接收到消息,它们就进行处理并等待下一个消息到来。另外,辅助线程用来执行后台处理而且不使用消息循环。Windows 计时器和基于服务器的计时器在运行时都使用 Interval 属性。线程计时器的时间间隔在 Timer 构造函数中设置。计时器的设计目的各不相同,它们的线程处理明确地指出了这一点:

  • Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。Windows 计时器的精度限定为 55 毫秒。这些传统计时器要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。对于 COM 组件来说,这样会降低性能。

  • 基于服务器的计时器是为在多线程环境下与辅助线程一起使用而设计的。由于它们使用不同的体系结构,因此基于服务器的计时器可能比 Windows 计时器精确得多。服务器计时器可以在线程之间移动来处理引发的事件。

  • 对消息不在线程上发送的方案中,线程计时器是非常有用的。例如,基于 Windows 的计时器依赖于操作系统计时器的支持,如果不在线程上发送消息,与计时器相关的事件将不会发生。在这种情况下,线程计时器就非常有用。

Windows 计时器位于 System.Windows.Forms 命名空间中,服务器计时器 System.Timers 命名空间中,线程计时器位于 System.Threading 命名空间中。

 

留一些问题在这个地方,希望如果看到本文章的各位,能够帮忙回答下:

1:DispatcherTimer算不算这样的Timer???????或者说,使用了如上的那个Timer? ????? System.Windows.Forms.Timer?????或者,就是System.Windows.Forms.Timer的WPF实现?

2:如下的代码:

            System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 10);
            dispatcherTimer.Start();

 private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            Lables.Content = "111";
            System.Threading.Thread.Sleep(5 * 60 * 1000);//模拟长时间的操作。。。
          }

如上红色的地方,虽然在 dispatcherTimer_Tick 函数里面,我们不一定必须使用Dispatcher.Invoke等等的形式来对Lables的调用,但是,如上的代码,还是会引起界面线程的挂起,呵呵。。所以,对于使用 计时器来间隔执行程序的时候,如果花费的时间长,还不如去使用System.Timers.Timer以及配合Dispatcher.Invoke..........来对界面的访问(当然,还要用到异步操作。。)

 

 

posted on 2009-06-23 23:20  颜昌钢  阅读(790)  评论(1编辑  收藏  举报