title: What was VB6's threading model?
body: <p>I'm porting an ancient VB6 program to C#/.Net. I don't know VB6 very well and I'm asking this to understand it better.  </p>
  
  <p>The old VB6 program had a main course of program execution, but it <strong>also</strong> had lots of event handlers either for socket events or for timer events and the handlers for these often manipulated shared resources, e.g., common global variables, whenever they woke up and ran.</p>
  
  <p>Nonetheless the old program seemed to run OK.    </p>
  
  <p>Trying to do this same architecture in C# is disastrous because event handlers for the socket or timers are called by the system in different threads from the main application thread and result in frequent exceptions like "The calling thread cannot access this object because a different thread owns it.", not to mention more subtle problems.   Most of my work in the conversion is re-architecting the program to make it thread-safe, and eliminating the original program's heavy use of global variables. </p>
  
  <p><strong>My question</strong> is Do VB6 event handlers run in separate threads?  If so how did VB6 ever get away with this?   Among other things, the VB6 program had a timer that woke up every 4 seconds, manipulated some global variables and went back to sleep, while the main program was doing its thing.  I can't understand why this didn't result in collisions.</p>