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();