UI 관련 작업은 UI 스레드 (메인 스레드)에서 해야 합니다. 윈폼이나 WPF가 그런 모델을 사용합니다. 그러므로
pMessage.Close()는 BeginInvoke(() => pMessage.Close())로 바꾸어야 하고요, 라벨링 할 때 UI 관련 작업 또한 마찬가지입니다.
간단하게 테스트하기 위해 다음의 코드로 확인하였습니다. 잘 동작합니다.
var waitForm = new WaitForm();
new Thread(() =>
{
BeginInvoke(() => waitForm.ShowDialog());
// 오래 걸리는 작업 시뮬레이션
Thread.Sleep(5000);
BeginInvoke(() => waitForm.Close());
}).Start();