<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="WpfApplication1.MainWindow" Height="200" Width="400"> <Button Click="aClick">Thread</Button> </Window> //File:Window.xaml.cs using System; using System.Threading; using System.Windows; using System.Windows.Threading; namespace WpfApplication1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Title = string.Format("Running on Main UI Thread {0}", Thread.CurrentThread.ManagedThreadId); } void aClick(object sender, RoutedEventArgs e) { Thread thread = new Thread(aMethod); thread.SetApartmentState(ApartmentState.STA); thread.IsBackground = true; thread.Start(); } void aMethod(){ try{ string msg = string.Format("secondary on worker thread {0}.", Dispatcher.CurrentDispatcher.Thread.ManagedThreadId); throw new Exception(msg); }catch (Exception ex){ int secondaryWorkerThreadId = Thread.CurrentThread.ManagedThreadId; Application.Current.Dispatcher.Invoke( DispatcherPriority.Send, (DispatcherOperationCallback)delegate(object arg) { string msg = string.Format("from secondary worker thread {0}.", secondaryWorkerThreadId); throw new Exception(msg, ex); } , null); } } } }