 <p>The freezing is due to the fact you are trying to change your progress bar contained on the UI thread from your worker thread. I would recommend raising an event from within your worker Progress function to a handler on the UI thread. You will need to marshall the call to the handler on the thread as below. </p> <pre><code>private object _lock = new object(); //should have class scope private void ShowProgressControl(EventArgs e) { if (this.InvokeRequired) { lock (_lock) { EventHandler d = new EventHandler(ShowProgressControl); this.Invoke(d, new object[] { e }); return; } } else { //Show your progress bar. } } </code></pre> <p>Enjoy!</p>