zoukankan      html  css  js  c++  java
  • 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);
            }
        }

  • 相关阅读:
    二维数组和指向指针的指针
    多路复用构建高性能服务器
    disque概要
    漫谈云计算与SOA (1)
    zeromq
    自定义内存分配
    基于行的操作
    反应器类型的操作
    多个流,简短的读和写
    缓存
  • 原文地址:https://www.cnblogs.com/gyouxu/p/2846554.html
Copyright © 2011-2022 走看看