You can use Application.Run() to run a message loop which will allow the callbacks to be called when the connect finishes. The call to Run() will block until you call Application.ExitThread(), which you should do in your callback handlers.
Alternatively, you can call Application.DoEvents() to process just the currently pending messages. You can put this in a loop to poll until one of the callbacks is called, or until too much time has passed.
I've just posted the source code for the TWS plugin which may help you, although it is socket-based instead of message-loop based, so the way it handles messages is different.