If you need it to be synchronous, don't use the thread. Threads should be for tasks going on in the background, not for doing critical stuff that you need to wait for.

As a general rule, if Thread.Join is the answer, you've misunderstodd how to do threading.

I often use the pattern

class SomeClass
{
  Thread bgThread;
  event System.EventHandler SomethingCompleted;
  public SomeClass()
  {
    bgThread = new Thread(() => { bgThreadMain(); });
  }
  public void StartBackgroundWork()
  {
    bgThread.Start();
  }
  private void bgThreadMain()
  {
    doSomethingThatMightTakeAWhile();
    if(SomethingCompleted != null) SomethingCompleted(this, EventArgs.Empty);
  }
  private void doSomethingThatMightTakeAWhile()
  {
    Process.Start("ping", "127.0.0.1");
  }
}

You then use it like:

void Foo()
{
  volatile bool keepDrawingAnimation = false;
  var x = new SomeClass();
  x.SomethingCompleted += new EventHandler( (o,e) => { keepDrawingAnimation = false; });
  x.Start();
  Console.WriteLine("Please wait...");
  while(keepDrawingAnimation)
  {
    Console.Write("."); Thread,Sleep(100);
  }
  Console.WriteLine("Done");
}