Most suggestions are already done, but here's an example how i would do it:
    ManualResetEvent _requestTermination = new ManualResetEvent(false);
    Thread _thread;
    public void Init()
    {
        _thread = new Thread(() =>
         {
             while (!_requestTermination.WaitOne(0))
             {
                 // do something usefull
             }
         }));
        _thread.Start();
    }
    public void Dispose()
    {
        _requestTermination.Set();
        // you could enter a maximum wait time in the Join(...)
        _thread.Join();
    }
This way the dispose will wait until the thread has exited.
If you need a delay within the thread, you shouldn't add Thread.Sleep. 
Use the WaitOne(delayTime). This way you will never have to wait to terminate it.