To add further to what EG said, it really does depend on the circumstances as to what is the best solution. We don't really know enough about the circumstances to say, so my definitive statement probably wasn't justified. There are various possibilities.

1. You might want BackgroundWorker-like behaviour, where events are always raised on the same thread on which the object was created. In that case, use the SynchronizationContext in the class itself. My BackgroundMultiWorker class in the VB.NET CodeBank is an example.

2. You might want the object to sometimes raise an event on whatever thread it is using internally and sometimes to raise an event on the thread that owns a specific control. For that, add your own SynchronisingObject property, much like the FileSystemWatcher and Timers.Timer do. You can then use this object to marshal internally if it is set.

3. As EG said, you might just let the form handle the marshalling all the time. This is probably less appropriate if the form should remain ignorant of the multi-threading inside the other class but, if your types are already tightly-coupled, this little bit more won't hurt.