但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