C# Timer使用(WPF、Winform)

概述

C#中的框架中,爲我們提供了幾種定時器,其實是3類。下面就通過自己的學習和應用簡單介紹下:

首先,定時器的原理:等待一段時間之後,開始執行任務;到了等待時間後,開始執行任務……一直循環。

System.Threading.Timer

簡介

這個定時器是一個單獨的線程,執行任務(定時器回調任務)的線程分配由線程池管理。如果要使用定時器,他是最好的選擇。優點:獨立線程,等待週期變化穩定,不會受其他線程(尤其是主線程)的影響。

使用

使用WPF作爲開發平臺,爲了演示效果,首先我們做下面的事情——搭建一個UI界面,定時器開始時,刷新UI上的Slider控件的Value

  • UI設計

    <Window x:Class="Melphi.MainWindow"
            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"
            xmlns:local="clr-namespace:Melphi"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <WrapPanel>
                <Border Width="200" Height="200" BorderBrush="Black" BorderThickness="1">
                    <StackPanel  >
    
                        <TextBlock FontSize="14" FontWeight="DemiBold" Text="System.Threading.Timer" Margin="5 10"/>
    
                        <Grid Margin="5 10">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="進度:" VerticalAlignment="Center"/>
                            <Slider Grid.Column="1" x:Name="SliderProcessing" Maximum="100" HorizontalAlignment="Stretch"/>
                        </Grid>
    
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                            <Button x:Name="ButtonStart" Click="ButtonStart_Click" Content="Start" Margin="5 0"/>
                            <Button x:Name="ButtonPause" Click="ButtonPause_Click" Content="Pause" Margin="5 0"/>
                        </StackPanel>
    
                    </StackPanel>
                </Border>
            </WrapPanel>
        </Grid>
    </Window>
    
    
  • 定時器的定義和控制

    using System;
    using System.Threading;
    using System.Windows;
    
    namespace Melphi
    {
        /// <summary>
        /// MainWindow.xaml 的交互邏輯
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                
                // 初始化定時器
                InitializeThreadingTimer();
            }
    
            /// <summary>
            /// System.Threading.Timer 實例,
            /// 最推薦使用的定時器
            /// </summary>
            private System.Threading.Timer mThreadingTimer;
    
            /// <summary>
            /// 初始化一個 System.Threading.Timer 定時器
            /// </summary>
            private void InitializeThreadingTimer()
            {
                // 初始化一個定時器:具有回調函數,無狀態的,不啓動,不終止定時器
                mThreadingTimer = new System.Threading.Timer(ThreadTimerCallback, null, Timeout.Infinite, Timeout.Infinite);
            }
    
            /// <summary>
            /// System.Threading.Timer 的回調方法
            /// </summary>
            /// <param name="state"></param>
            private void ThreadTimerCallback(object state)
            {
                // 告訴定時器,等待多久執行一次回調
                mThreadingTimer.Change(500, Timeout.Infinite);
    
                // TODO 
    
                // 使用UI線程刷新數據刷新界面
                this.Dispatcher.BeginInvoke(new Action(() => this.SliderProcessing.Value += 5), System.Windows.Threading.DispatcherPriority.Normal, null);
            }
    
            /// <summary>
            /// 開始 控制 System.Threading.Timer 定時器
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void ButtonStart_Click(object sender, RoutedEventArgs e)
            {
                // 馬上啓動定時器
                mThreadingTimer.Change(0, Timeout.Infinite);
            }
            /// <summary>
            /// 暫停 控制 System.Threading.Timer 定時器
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void ButtonPause_Click(object sender, RoutedEventArgs e)
            {
                // 暫時停止定時器
                mThreadingTimer.Change(Timeout.Infinite, Timeout.Infinite);
            }
        }
    }
    
  • 效果
    在這裏插入圖片描述

總結

可以System.Threading.Timer的控制主要通過Change函數來實現。

System.Timers.Timer

簡介

他的本質是System.Threading.Timer類的包裝器,計時器到期會觸發,導致CLR將要處理的事件放到線程池隊列中。因此它的任務執行也是一個單獨的線程完成。但是他的弊端和BUG較多,因此開發過程中強烈建議不要使用、不要使用、不要使用。

使用

既然強烈建議不使用,這裏我就不做它的使用示例了:)

System.Windows.Threading.DispatcherTimer

簡介

這個WPF\Sliverlight平臺特有的定時器,該定時器跟Windows的消息機制相關,它的調度與主線程息息相關,執行回調任務或者把定時器掛起等待等所有任務都是由主線程來完成。因此該定時器的準時性會受控於主線程空閒程度。優點:由於定時器執行 的任務是通過主線程來進行調度,因此可以直接在定時器內對主線程定義的對象(例如控件)直接操作。

使用

使用WPF作爲開發平臺,爲了演示效果,首先我們做下面的事情——搭建一個UI界面,定時器開始時,刷新UI上的Slider控件的Value。和前面System.Threading.Timer一毛一樣哦。

  • UI

    <Window x:Class="Melphi.MainWindow"
            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"
            xmlns:local="clr-namespace:Melphi"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <WrapPanel>
                <!-- System.Threading.Timer -->
                <Border Width="200" Height="200" BorderBrush="Black" BorderThickness="1">
                    <StackPanel  >
    
                        <TextBlock FontSize="14" FontWeight="DemiBold" Text="System.Threading.Timer" Margin="5 10"/>
    
                        <Grid Margin="5 10">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="進度:" VerticalAlignment="Center"/>
                            <Slider Grid.Column="1" x:Name="SliderProcessing" Maximum="100" HorizontalAlignment="Stretch"/>
                        </Grid>
    
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                            <Button x:Name="ButtonStart" Click="ButtonStart_Click" Content="Start" Margin="5 0"/>
                            <Button x:Name="ButtonPause" Click="ButtonPause_Click" Content="Pause" Margin="5 0"/>
                        </StackPanel>
    
                    </StackPanel>
                </Border>
    
                <!-- System.Windows.Threading.DispatcherTimer UI -->
                <Border Width="200" Height="200" BorderBrush="Black" BorderThickness="1">
                    <StackPanel  >
    
                        <TextBlock FontSize="14" TextWrapping="Wrap" FontWeight="DemiBold" Text="System.Windows.Threading.DispatcherTimer" Margin="5 10"/>
    
                        <Grid Margin="5 10">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="進度:" VerticalAlignment="Center"/>
                            <Slider Grid.Column="1" x:Name="SliderDispatcherProcessing" Maximum="100" HorizontalAlignment="Stretch"/>
                        </Grid>
    
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                            <Button x:Name="ButtonDispatcherStart" Click="ButtonDispatcherStart_Click" Content="Start" Margin="5 0"/>
                            <Button x:Name="ButtonDispatcherPause" Click="ButtonDispatcherPause_Click" Content="Pause" Margin="5 0"/>
                        </StackPanel>
    
                    </StackPanel>
                </Border>
            </WrapPanel>
        </Grid>
    </Window>
    
    
  • 定時器的使用和控制

    using System;
    using System.Threading;
    using System.Windows;
    
    namespace Melphi
    {
        /// <summary>
        /// MainWindow.xaml 的交互邏輯
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                InitializeWindowsDispatcherTimer();
            }
    
    
            /// <summary>
            /// System.Windows.Threading.DispatcherTimer 實例,
            /// 不推薦使用的定時器
            /// </summary>
            private System.Windows.Threading.DispatcherTimer mWindowsDispatcherTimer;
    
            /// <summary>
            /// 初始化 System.Windows.Threading.DispatcherTimer 定時器  
            /// </summary>
            private void InitializeWindowsDispatcherTimer()
            {
                // 初始化一個定時器,時間間隔爲500ms
                mWindowsDispatcherTimer = new System.Windows.Threading.DispatcherTimer()
                {
                    Interval = new TimeSpan(0, 0, 0, 0, 500)
                };
                // 設置定時器間隔發生的處理事件(
                mWindowsDispatcherTimer.Tick += MWindowsDispatcherTimer_Tick;
            }
    
            /// <summary>
            /// 超過計時器間隔,這個方法會被執行一次,在UI線程中執行
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void MWindowsDispatcherTimer_Tick(object sender, EventArgs e)
            {
                // TODO
                
                // 直接刷新 UI 元素
                SliderDispatcherProcessing.Value += 5;
            }
    
            /// <summary>
            /// 啓動定時器
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void ButtonDispatcherStart_Click(object sender, RoutedEventArgs e)
            {
                mWindowsDispatcherTimer.Start();
            }
    
            /// <summary>
            /// 停止定時器
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void ButtonDispatcherPause_Click(object sender, RoutedEventArgs e)
            {
                mWindowsDispatcherTimer.Stop();
            }
        } 
    }
    
    
  • 效果
    在這裏插入圖片描述

總結

直接設置時間間隔,具有StartStop等控制方法。可以直接操作UI線程創建的對象。

System.Windows.Forms.Timer

簡介

這是 Winform 平臺特有的定時器,該定時器的工作原理和System.Windows.Threading.DispatcherTimer相同,針對的平臺是Winform。優缺點相同。

使用

  • UI設計
    在這裏插入圖片描述

  • 定時器的使用和控制

    using System;
    using System.Windows.Forms;
    
    namespace Melphi.Winform
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                InitializeWindowsFromsTimer();
            }
    
            /// <summary>
            /// System.Windows.Forms.Timer 實例
            /// </summary>
            System.Windows.Forms.Timer mWindowsFromsTimer;
    
            /// <summary>
            /// 初始化 System.Windows.Forms.Timer 定時器  
            /// </summary>
            private void InitializeWindowsFromsTimer()
            {
                // 初始化一個定時器,時間間隔爲500ms
                mWindowsFromsTimer = new System.Windows.Forms.Timer()
                {
                     Interval= 500,
                };
    
                // 設置定時器間隔發生的處理事件(
                mWindowsFromsTimer.Tick += MWindowsFromsTimer_Tick;
            }
    
            /// <summary>
            /// 超過計時器間隔,這個方法會被執行一次,在UI線程中執行
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void MWindowsFromsTimer_Tick(object sender, EventArgs e)
            {
                // TODO
    
                // 直接控制UI控件
                progressBar1.Value += 2;
            }
    
            /// <summary>
            /// 啓動定時器
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void ButtonStart_Click(object sender, EventArgs e)
            {
                mWindowsFromsTimer.Start();
            }
    
            /// <summary>
            /// 停止定時器
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void ButtonStop_Click(object sender, EventArgs e)
            {
                mWindowsFromsTimer.Stop();
            }
        }
    }
    
    
  • 效果
    在這裏插入圖片描述

總結

WPFDispatcherTimer非常相似,用法和功能上,因爲調度是UI線程來完成,因此都能直接控制UI控件。

System.UI.Xaml. DispatcherTimer

簡介

這是 Window Store 平臺特有的定時器,該定時器的工作原理和System.Windows.Threading.DispatcherTimer相同,針對的平臺是 Window Store。優缺點相同。

使用

和前面的使用差不多,這裏就不在多做描述了,請讀者自行完成。


Over

每次記錄一小步…點點滴滴人生路…

發佈了52 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章