 <p>You could use ManualResetEvents and WaitHandle.WaitAny. Basically when one thread is done you would notify the other thread by using a ManualResetEvent (ManualResetEvent.Set()). </p> <pre><code>ManualResetEvent threadFinished = new ManualResetEvent(false); //You would set this in the thread that has finished threadFinished.Set() //You would use this in the thread that you want to wait for this event to be signalled int nWait = WaitHandle.WaitAny(new ManualResetEvent[] { threadFinished }, 10, true); //if yes stop thread if (nWait == 0) { //Thread is finished } </code></pre>