This type is entirely unnecessary for "normal" .NET code; it is needed only for COM interoperability capability. Apartments are a COM-threading construct. There are two threading apartments: single-threaded ( STA ) and multithreaded ( MTA ). Once a thread joins an apartment, it cannot join another one. If you want to create or access a COM object from a thread, that thread must belong to an apartment. Further, a given COM component may only be compatible with a certain apartment state. What if an STA thread needs to call a method on a COM object that is only compatible with MTA threads? In that case, a different thread that is already in the MTA state must service the request. The COM Service Control Manager either creates a new thread or uses one allocated for servicing remote procedure calls to accomplish this Threads in an MTA apartment cannot directly access STA threads either. Instead, the STA thread contains a message sink, and the method is invoked when the thread in that apartment is free. .NET objects do away with this requirement; however, if some of the threads call COM objects, they must first join an apartment. The Thread class usually handles this automatically, but you can join an apartment directly by assigning a parameter from this enumeration to the Thread.ApartmentState property. Unknown indicates that the thread has not joined an apartment. Figure 42-1. The System.Threading namespacepublic enum ApartmentState { STA = 0 , MTA = 1 , Unknown = 2 } HierarchySystem.Object System.ValueType System.Enum(System.IComparable , System.IFormattable , System.IConvertible) ApartmentState Returned ByThread.ApartmentState Passed ToThread.ApartmentState Figure 42-2. Delegates, exceptions, and event arguments in the System.Threading namespace |