<Window x:Class="WPFThreading.UnblockThreadTwo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="UI Thread Blocker" Height="275" Width="225"> <Border Width="200" Height="225" BorderBrush="Black" BorderThickness="1" Margin="4"> <StackPanel> <Label>Simulate Long-Running Process</Label> <Button Name="button1" Click="button1_click">Go to sleep</Button> <Label>Will I respond?</Label> <Button Name="button2" Click="button2_click">Try Me</Button> <Label>Output Messages</Label> <TextBox Name="textbox1"/> <Label/> <StackPanel Orientation="Horizontal"> <Label>UI thread:</Label> <Label Name="UIThreadLabel"></Label> </StackPanel> <StackPanel Orientation="Horizontal"> <Label>BG thread:</Label> <Label Name="BackgroundThreadLabel"></Label> </StackPanel> </StackPanel> </Border> </Window> //File:Window.xaml.cs using System.Windows; using System.ComponentModel; using System.Threading; using System.Windows.Threading; namespace WPFThreading { public partial class UnblockThreadTwo : System.Windows.Window { private BackgroundWorker worker; private delegate void SimpleDelegate(); public UnblockThreadTwo() { InitializeComponent(); this.UIThreadLabel.Content = this.Dispatcher.Thread.ManagedThreadId; this.BackgroundThreadLabel.Content = "N/A"; } private void button1_click(object sender, RoutedEventArgs e) { worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(RunOnBGThread); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BGThreadWorkDone); worker.RunWorkerAsync(); } private void button2_click(object sender, RoutedEventArgs e) { this.textbox1.Text = "Hello WPF"; } private void LongRunningProcess() { SimpleDelegate del1 = delegate(){ this.BackgroundThreadLabel.Content = Thread.CurrentThread.ManagedThreadId; }; this.Dispatcher.BeginInvoke(DispatcherPriority.Send, del1); Thread.Sleep(5000); } private void RunOnBGThread(object sender, DoWorkEventArgs e) { LongRunningProcess(); } private void BGThreadWorkDone(object sender,RunWorkerCompletedEventArgs e) { this.textbox1.Text = "Done Sleeping.."; } } }