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.
public enum ApartmentState {
STA = 0,
MTA = 1,
Unknown = 2
}