You are best doing all the initialization tasks in a background thread. This will keep your UI responsive.
This answer to a related question has some sample code in C#.
It might be easiest to use a BackgroundWorker
for that task (simply drag the BackroundWorker component onto your form). Using a BackgroundWorker you can also easily report the percentage of the initialization that is already done, e.g. to be displayed in a progress bar.
Public Class Form1
Private splash As BMSSplash
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
splash = New BMSSplash
splash.Show()
BackgroundWorker1.WorkerReportsProgress = True
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object,
ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim percentageCompleted As Integer
BackgroundWorker1.ReportProgress(percentageCompleted,
"Retrieving active users...")
' replace the sleeps with the longer-running init task
System.Threading.Thread.Sleep(5000)
BackgroundWorker1.ReportProgress(percentageCompleted,
"Retrieving bonder info...")
System.Threading.Thread.Sleep(5000)
End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object,
ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
Dim message As String = e.UserState
splash.lblStatus.Text = message
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object,
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
splash.Close()
End Sub
End Class