<p>From the MSDN article on STAThread:</p>

<blockquote>
  <p>Indicates that the COM threading model for an application is single-threaded apartment (STA).</p>
</blockquote>

<p>(For reference, that's <a href="http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx" rel="noreferrer">the entire article</a>.)</p>

<p>Single-threaded apartment... OK, that went over my head. Also, I read somewhere that unless your application uses COM interop, this attribute actually does nothing at all. So what exactly does it do, and how does it affect multithreaded applications? Should multithreaded applications (which includes anything from anyone using <code>Timer</code>s to asynchronous method calls, not just threadpools and the like) use MTAThread, even if it's 'just to be safe'? What does STAThread and MTAThread actually do?</p>

What that does it it ensures that
```
CoInitialize
```
is called specifying COINIT_APARTMENTTHREADED as the parameter. If you do not use any COM components or ActiveX controls it will have no effect on you at all. If you do then it's kind of crucial.
Controls that are apartment threaded are effectively single threaded, calls made to them can only be processed in the apartment that they were created in.
Some more detail from MSDN:
Objects created in a single-threaded
  apartment (STA) receive method calls
  only from their apartment's thread, so
  calls are serialized and arrive only
  at message-queue boundaries (when the
  Win32 function PeekMessage or
  SendMessage is called).
Objects created on a COM thread in a
  multithread apartment (MTA) must be
  able to receive method calls from
  other threads at any time. You would
  typically implement some form of
  concurrency control in a multithreaded
  object's code using Win32
  synchronization primitives such as
  critical sections, semaphores, or
  mutexes to help protect the object's
  data.
When an object that is configured to
  run in the neutral threaded apartment
  (NTA) is called by a thread that is in
  either an STA or the MTA, that thread
  transfers to the NTA. If this thread
  subsequently calls CoInitializeEx, the
  call fails and returns
  RPC_E_CHANGED_MODE.