但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

