We learned a lot in this chapter about debugging applications with many concurrent threads and coordinating the entire debugging process. Specifically, we covered:
- Preparing the multithreaded code to simplify the debugging and troubleshooting processes using names for the threads to identify them in the IDE
- Watching and inspecting the execution of multiple concurrent threads created with an instance of the
Thread class or as a result of calling a BackgroundWorker component
- Freezing many threads to allow us to debug one thread at a time, without the problems related to concurrency while executing the application step-by-step
- Inserting breakpoints and tracepoints to simplify troubleshooting complex multithreaded applications ...