At the risk of throwing complexity into the mix: this is the sort of thing Windows Workflow Foundation (WF) is designed for.
I'm not a huge fan of WF, but one of the places where it does have value is where you have a "long running" operation that needs to be paused/resumed. I think that's what you are describing, and so it may be helpful.
Then again, it may be overkill :)
If you really just want to pause a thread, you'd typically use an AutoResetEvent or ManualResetEvent. The background thread would do its work, and then call WaitOne() on the event object. That blocks the background thread.
The foreground thread, meanwhile, is working away, and when it wants the background thread to resume it calls _event.Set() - which allows the background thread to continue.
What you'd probably do is use a synchronized queue. Have the foreground thread write the CD data into the queue and launch the background thread.
The background thread reads the items off the queue until they are gone, then does its _event.WaitOne().
The foreground thread, meanwhile, finds out if more CDs are forthcoming. If so, it gets the CD, writes the data to the queue and calls _event.Set().
This causes the background thread to again process all items in the queue and call _event.WaitOne().
If there are no more CDs, the foreground thread either writes a dummy "termination" item into the queue, or writes nothing into the queue (so the queue is empty). It then calls _event.Set().
The background thread, at this point, resumes and finds either the "termination" dummy, or an empty queue. Whichever technique you use - this is the trigger that tells the background thread that it is done, so it can close out the work and end gracefully.
Copyright (c) Marimer LLC