 <p>Here's a version of the code that runs on seperate threads. The code you provided above wasn't running a message loop on the second thread. Also setting CheckForIllegalCrossThreadCalls = false is a really bad idea for what you're trying to achieve.</p> <p>Usage:</p> <pre><code> ProgressForm.Initialise() ProgressForm.ShowProgressForm("hello", "hello") Dim modalForm As New Form With {.Text = "MyModalForm"} modalForm.ShowDialog() ProgressForm.HideProgressForm() ProgressForm.TearDown() </code></pre> <p>And here's the ProgressForm definition.</p> <pre><code>Public Class ProgressForm Inherits Form Private Shared sForm As ProgressForm Private Shared sThread As Thread Public Sub New() Me.TopMost = True Me.BackColor = Color.Green Me.Text = "Progress" End Sub Public Shared Sub Initialise() 'Create the form sThread = New Thread(AddressOf ThreadFunc) sThread.Start() While sForm Is Nothing OrElse sForm.InvokeRequired = False Thread.Sleep(0) End While End Sub Public Shared Sub TearDown() sForm.BeginInvoke(Sub() Application.ExitThread()) End Sub Private Shared Sub ThreadFunc() sForm = New ProgressForm 'Dim handle = sForm.Handle Application.Run(sForm) End Sub Public Shared Sub ShowProgressForm(caption As String, title As String) If sForm.InvokeRequired Then sForm.BeginInvoke(Sub() ShowProgressForm(caption, title)) Else sForm.Text = title 'TODO: Caption sForm.Visible = True sForm.TopMost = True End If End Sub Public Shared Sub HideProgressForm() If sForm.InvokeRequired Then sForm.BeginInvoke(Sub() HideProgressForm()) Else sForm.Visible = False End If End Sub Private Sub ProgressForm_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If e.CloseReason = CloseReason.UserClosing Then Me.Visible = False e.Cancel = True End If End Sub End Class </code></pre>