好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

DispatcherTimer与Dispatcher小小应用

DispatcherTimer与Dispatcher小小应用

在使用DispatcherTimer之前,需要使用 using System.Windows.Threading ;命名空间;集成到按指定时间间隔和指定优先级处理的 Dispatcher 队列中的计时器。  在每个 Dispatcher 循环的顶端重新计算 DispatcherTimer。 不能保证会正好在时间间隔发生时执行计时器,但能够保证不会在时间间隔发生之前执行计时器。 这是因为 DispatcherTimer 操作与其他操作一样被放置到 Dispatcher 队列中。 何时执行 DispatcherTimer 操作取决于队列中的其他作业及其优先级。在使用时代码如下:

          public   Pachertime()
        {
            InitializeComponent();
             DispatcherTimer  time  =  new    DispatcherTimer ();
             time.Interval    = new TimeSpan(0, 0, 1);
            time.Tick += new    EventHandler( time_Tick );
            time.Start(); 
        }

          void   time_Tick ( object   sender, EventArgs e)
        {
            tbkTimer.Text  =  "  当前时间:  "  +  DateTime.Now.ToLongTimeString();
        } 

主要代码如上,则在客户端可以看到一个在不断更新的时间;DispatchTimer主要适合于调度任务的情况。事实上,除StoryBoard组件之外dispatcherTimer也是Silverlight编程中实现动画效果的一种重要技术。当然,我们应该当心使用dispatcherTimer有可能导致创建太多的后台线程,从而有可能导致增加 CPU 的负荷而降低效率。

    Dispatcher同样的需要使用 using System.Windows.Threading 命名空间;Dispatcher 类当前只提供从非用户界面 (UI) 线程在 UI 上运行代码的支持。 您可以通过 DependencyObject . Dispatcher 和 ScriptObject . Dispatcher 属性访问 UI 线程的 Dispatcher 对象。这些方法是实例方法,但这些类型的实例无法频繁从非 UI 线程访问。

下面是一个实现 倒计时 功能的例子:

前台XAMl代码:

<UserControl x:Class= "  slStudy.Timer  "  
    xmlns = "  http://schemas.microsoft.com/winfx/2006/xaml/presentation  "  
    xmlns:x = "  http://schemas.microsoft.com/winfx/2006/xaml  "  
    xmlns:d = "  http://schemas.microsoft.com/expression/blend/2008  "  
    xmlns:mc = "  http://schemas.openxmlformats.org/markup-compatibility/2006  "  
    mc:Ignorable = "  d  "  
    d:DesignHeight = "  300  "  d:DesignWidth= "  400  " >

    <StackPanel x:Name= "  layerout  "  >
        <Border x:Name= "  border  "  Background= "  AliceBlue  "  Width= "  200  "  Height= "  50  "  Margin= "  5  "  BorderBrush= "  Black  "  BorderThickness= "  3  "  CornerRadius= "  5  " ></Border>
        <StackPanel Margin= "  80 0 0 0  "  Orientation= "  Horizontal  "  Width= "  188  " >
            <Button Content= "  开始  "  x:Name= "  btnStart  "  Width= "  66  "  Height= "  30  "  Margin= "  5  "  Click= "  btnStart_Click  " ></Button>
            <Button Content= "  延迟  "  x:Name= "  btnJoin  "  Width= "  100  "  Height= "  30  "  Margin= "  5  "  Click= "  btnJoin_Click  " ></Button>
        </StackPanel>
    </StackPanel>
</UserControl>

后台C#代码如下:

  public   partial   class   Timer : UserControl
    {
          private   static   System.Windows.Controls.TextBlock tbk;
          private   Thread thread;
          public   Timer()
        {
            InitializeComponent();
            tbk  =  new   TextBlock()
            {
                FontSize  =  15  ,
                Width  =  300  ,
                Height  =  100  ,
            };

            border.Child  =  tbk;
             thread    = new    Thread(Timer.SetText); 
        }

          public   static   void   SetText()
        {
              int  i =  60  ;
              while  (i >  0  )
            {
                 tbk.Dispatcher.BeginInvoke(   delegate   () 
                {
                    tbk.Text  =  "  倒计时:  "  + i +  "  秒  "  ;
                });
                i -- ;
                 Thread.Sleep(   1000   ); 
            }
        }

          private   void  btnStart_Click( object   sender, RoutedEventArgs e)
        {
            thread.Start();
        }

          private   void  btnJoin_Click( object   sender, RoutedEventArgs e)
        {
            thread.Join(  2000  );
        }
    } 

 

 

 

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于DispatcherTimer与Dispatcher小小应用的详细内容...

  阅读:43次