No lo fai dall'esterno:
codice:t.Start(); //Fai partire il thread t //eventualmente fai altro... t.join(2000); //attendi la fine del thread per un massimo di ulteriori 2 secondi if (t.ThreadState != ThreadState.Stopped) //t non è terminato t.Abort();