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小小应用的详细内容...