Mega Code Archive

 
Categories / C# / WPF
 

Unblock Thread with BackgroundWorker

<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..";     }   } }