Handling threading exceptions
There are a couple of exception types that are specific to managed threading, including the
ThreadInterruptedException exception that we covered in the previous section. Another exception type that is specific to threading is
ThreadAbortException. However, as we discussed in the previous section,
Thread.Abort is not supported in .NET 6, so, although this exception type exists in .NET 6, it is not necessary to handle it, as this type of exception is only possible in .NET Framework applications.
Two other exceptions are the
ThreadStartException exception and the
ThreadStateException exception. The
ThreadStartException exception is thrown if there is a problem starting the managed thread before any user code in the thread can be executed. The
ThreadStateException exception is thrown when a method on the thread is called that is not available when the thread is in its current
ThreadState property. For example, calling
Thread.Start on a thread that has already started is invalid and will cause a
ThreadStateException exception. These types of exceptions can usually be avoided by checking the
ThreadState property before acting on the thread.
It is important to implement comprehensive exception handling in multithreaded applications. If code in managed threads begins to fail silently without any logging or causing the process to terminate, the application can fall into an invalid state. This can also result in degrading performance and unresponsiveness. While this kind of degradation might be noticed quickly for many applications, some services, and other non-GUI-based applications, could continue for some time without any issues being noticed. Adding logging to the exception handlers along with a process to alert users when logs are reporting failures will help to prevent problems with undetected failing threads.