The reason why I'm asking is do I need to do special things to make my code re-entrant?
No unless you do something that causes execution to return to the message loop. The only thing likely to do this is DoEvents.
Basic4ppc events raised from external sources running on a different thread rely on Form.Invoke to cross to the main application thread and in turn Invoke relies on placing messages on the application message queue. Most Basic4ppc control events are raised by the OS and also arrive by the message loop although library events raised by library code running on the main thread actually call their event Sub directly.
All Basic4ppc events are run on the main, usually only thread, even when called from another thread belonging to another process. This is so they can safely manipulate GUI elements. If a different thread fired the event, causing Invoke to be invoked, it is stalled until the event code returns so the queuing behaviour, if any, is determined by the code that fires the event and is not determined by Basi4ppc. No other event is accepted by Basic4ppc until any existing event returns
unless code returns to the message loop when another event Sub may be invoked effectively interrupting the previous event and possibly causing reentrancy problems.
I hope this isn't too complicated - if it seems so it is because there is a lot happening behind .NET events.