The trick is to initialize the thread STA, start the thread message pump and use a dispatcher to send code to the thread for execution.
Use the following code to roll a progress indicator. Not shown is the ProgressDialog class which for me is a XAML window that exposes a progress bar (named bar) and a label (named label)
class ProgressIndicator { Thread t; ProgressDialog progdialog; bool running = false; public void Start() { t = new Thread(ThreadFunc); t.SetApartmentState(ApartmentState.STA); // set the thread to STA t.Start(); while (!running) ; // block until the thread is ready to accept updates } public void UpdateProgress(double Progress, String label) { progdialog.Dispatcher.BeginInvoke( (System.Windows.Forms.MethodInvoker)delegate() { progdialog.bar.Value = Progress; progdialog.label.Content = label; } ); } public void Stop() { try { progdialog.Dispatcher.BeginInvoke( (System.Windows.Forms.MethodInvoker)delegate() { progdialog.Close(); } ); t.Abort(); t.Join(); } catch (Exception) { } finally { t = null; } } protected void ThreadFunc() { progdialog = new ProgressDialog(); progdialog.Show(); progdialog.Closed += (sender2, e2) => progdialog.Dispatcher.InvokeShutdown(); // if main window closes... progdialog.bar.Maximum = 1; // I always like dealing with 0 -> 1 progress running = true; System.Windows.Threading.Dispatcher.Run(); // start the message pump } }Copy and paste the code and implement the ProgressDialog class with a progress bar named bar and a label named label and this should let you start and update a progress bar in a second UI thread.