Eine Möglichkeit, aber wahrscheinlich gibt es bessere Möglichkeiten. Erstellen Sie ein neues Dialogformular, das Ihr Fortschrittsfenster/Splash-Screen sein wird. Fügen Sie ein Bitmap oder was auch immer als einziges Element hinzu. Instanziieren Sie den Dialog aus Ihrem Hauptprogramm. Überschreiben Sie das Load-Ereignis für das Fortschrittsformular und starten Sie von dort aus den neuen Thread, der die Hintergrundverarbeitung zum Laden der Daten übernimmt. Auf diese Weise können Sie ShowDialog einfach aus Ihrer Hauptanwendung aufrufen.
Wenn Sie System.ComponentModel.BackgroundWorker verwenden, dann können Sie einfach Ereignisse für die Beendigung des Threads und das automatische Beenden des Dialogs von diesem Ereignis aus verdrahten. Die Kontrolle wird an die aufrufende Anwendung zurückgegeben und Sie sind fertig.
Ich habe diese Art von Sache in einer Anwendung vor getan und es funktioniert gut, aber ich bin sicher, es ist ein Anfänger Ansatz. Hier ist Beispielcode aus dem Load-Ereignis im Formular, das den Hintergrund-Thread startet (in meinem Fall öffne ich große Dateien und analysiere sie):
private void FileThreadStatusDialog_Load(object sender, EventArgs e)
{
Cursor = Cursors.WaitCursor;
if (m_OpenMode)
{
this.Text = "Opening...";
StatusText.Text = m_FileName;
FileThread = new BackgroundWorker();
FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
FileThread.DoWork += new DoWorkEventHandler(FileOpenThread_DoWork);
FileThread.WorkerSupportsCancellation = false;
FileThread.RunWorkerAsync();
}
else
{
this.Text = "Saving...";
StatusText.Text = m_FileName;
FileThread = new BackgroundWorker();
FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
FileThread.DoWork += new DoWorkEventHandler(FileSaveThread_DoWork);
FileThread.WorkerSupportsCancellation = false;
FileThread.RunWorkerAsync();
}
}
Und so sieht die Methode "Work completed" aus, die das Formular enthält:
private void FileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
FileThread = null;
DialogResult = DialogResult.OK;
Close();
}
So öffne ich den Fortschrittsdialog über den Hauptdialog:
FileThreadStatusDialog thread = new FileThreadStatusDialog(m_Engine, dlg.FileName, true);
if (thread.ShowDialog(this) == DialogResult.OK)
{
m_Engine = thread.Engine;
FillTree();
}