In this chapter, we looked at threads, their properties, how we can use parameterized threads, and the difference between foreground and background threads with detailed examples. We also learned about thread states and how threads store and share data across multiple threads. This is where we discussed different synchronization methods. We focused on parallel programming, tasks and asynchronous programming using tasks, how to use parallel classes, and PLINQ.
In the next chapter, we will explore exception handling in C#. Exception handling helps us deal with any unexpected or exceptional situations that occur during program execution. Exception handling uses the try, catch, and finally blocks. These help developers try out actions that may or may not succeed, handle failures if they occur, and clean up unwanted resources, respectively.