When you call Kill(), the thread is still running. Stop() method is supposed to let the thread know that it should stop as soon as possible, but depending on your implementation of Run() the thread may actually never stop. In your case it will stop, but may do it with a certain delay (thread may be suspended at the moment). You don’t however wait for it to stop, instead deleting it instantly. So you’re pulling the rug from under it. The thread wakes up, accesses “this” pointer or sth else and crashes. Simply put, you have to wait for the thread to actually stop before deleting it.