經常要考慮的,背景的耗時操作不要卡死主界面的問題。

<StackPanel VerticalAlignment="Center">
<Label x:Name="lblHello">歡迎你光臨WPF的世界!</Label>
<Button Name="btnThd" Click="btnThd_Click" >多線程同步調用</Button>
<Button Name="btnAppBeginInvoke" Click="btnAppBeginInvoke_Click" >BeginInvoke 異步調用</Button>
</StackPanel>
Behind Code:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ModifyUI()
{
//// 模拟一些工作正在進行
//Thread.Sleep(TimeSpan.FromSeconds(2));
//lblHello.Content = "歡迎你光臨WPF的世界,Dispatcher";
// 模拟一些工作正在進行
Thread.Sleep(TimeSpan.FromSeconds(3));
this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate ()
{
lblHello.Content = "歡迎你光臨WPF的世界,Dispatche 同步方法 !!";
});
}
private void btnThd_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(ModifyUI);
thread.Start();
}
private void btnAppBeginInvoke_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(3));
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new Action(() =>
{
//Thread.Sleep(TimeSpan.FromSeconds(3)); // 放這裡還是會卡 UI 界面線程
this.lblHello.Content = "歡迎你光臨WPF的世界,Dispatche 異步方法!!" + DateTime.Now.ToString();
}));
}).Start();
}
}
這樣調用,是不會卡主界面的。