2013/05/15

C# WPF Timer

這個專案主要透過Timer的Thread去進行UI更新,但Timer是一個Thread
但Main是一個視窗,一個視窗也是一個Thread去Run的
所以一個視窗要有兩個Thread必須透過一些OS提出的機制去解決

我在這邊就是用SynchronizationContext去解決,推薦先看完『[WPF] 跨執行緒控制表單』這篇文章。

這篇文章非常值得推薦,看起來對方好像不是微軟MVP,但這篇卻深入瞭解到Thread的精隨
這位前輩在他的文章還有貼了一篇『MSDN 雜誌:平行計算 - SynchronizationContext 綜述』,非常值得一看!!








<Window x:Class="Time.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="74" Width="114" Loaded="Window_Loaded">
    <Label Height="28" Name="label1" />
</Window>

這隻程式一秒會更新一次時間,直到關閉程式為止


using System;
using System.Threading;
using System.Windows;

namespace Time
{
    public partial class MainWindow : Window
    {
        private Timer timer;
        private SynchronizationContext syncContext = null;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            syncContext = SynchronizationContext.Current;
            timer = new Timer(Timer_Ticked, null, 0, 1000);
        }

        private void Timer_Ticked(Object stateInfo)
        {
            SendOrPostCallback callBack = delegate(object state)
            {
                this.label1.Content = string.Format("{0:T}", DateTime.Now.ToLocalTime());
            };
            syncContext.Post(callBack, null);
        }
    }
}





參考資料:
http://www.dotblogs.com.tw/clark/archive/2013/05/04/102772.aspx
http://msdn.microsoft.com/zh-tw/magazine/gg598924.aspx
http://giga0066.pixnet.net/blog/post/29817017