private ManualResetEvent m_Event = new ManualResetEvent (); public void StartThread() { ThreadPool.QueueUserWorkItem (new WaitCallback (ThreadRun), null); } private void ThreadRun (object state) { while(true) { // do work, do work if(m_Event.WaitOne(0)) { // time to exit } } } private void OnButtonClick() { m_Event.Set (); // Tell the thread it's time to exit gracefully; }