What does this from General Recommandation #3 mean?
Don't control the execution of worker threads from your main program (using events, for example). Instead, design your program so that worker threads are responsible for waiting until work is available, executing it, and notifying other parts of your program when finished. If your worker threads do not block, consider using thread pool threads. Monitor.PulseAll is useful in situations where worker threads block.
Can someone explain by examples please?
-- Source: MSDN - Managed Threading Best Practices