Вы можете использовать System.Threading.EventWaitHandle .
EventWaitHandle блокируется, пока не будет сообщено. В вашем случае это будет сигнализироваться событием нажатия кнопки.
private void MyThread()
{
// do some stuff
myWaitHandle.WaitOne(); // this will block until your button is clicked
// continue thread
}
Вы можете указать свой дескриптор ожидания следующим образом:
private void Button_Click(object sender, EventArgs e)
{
myWaitHandle.Set(); // this signals the wait handle and your other thread will continue
}