<p>Events are synchronous in C#. I have this application where my main form starts a thread with a loop in it that listens to a stream. When something comes along on the stream an event is fired from the loop to the main form. </p>

<p>If the main form is slow or shows a messagebox or something the loop will be suspended. What is the best way around this? By using a callback and invoke on the main form?</p>

Since you're using a form, the easier way is to use the
BackgroundWorker
component.
The BackgroundWorker class allows you
  to run an operation on a separate,
  dedicated thread. Time-consuming
  operations like downloads and database
  transactions can cause your user
  interface (UI) to seem as though it
  has stopped responding while they are
  running. When you want a responsive UI
  and you are faced with long delays
  associated with such operations, the
  BackgroundWorker class provides a
  convenient solution.