If you load different forms into different streams, you need to be very careful when you make calls between forms - you will need to use Control.Invoke / BeginInvoke everywhere.
Please note that although each top-level window can work in a different thread, all controls in the window must be created (or rather, they must have their own descriptor) in the stream for this window.
Why not download the database information in the background, and then when this is over, you can create the actual form and display it? (Until then, you can either change the wait cursor, or perhaps put a message about the status of "Loading data ...".
source share