2010-12-21 5 views
3

Ich habe ein loadingForm mit nur einem Fortschrittsbalken mit Marquee-Stil erstellt. In meinem Main versuche ich, dies zu tun:C# Wie lade ich ein Formular mit Markierbalken?

//before downloading 
loadingForm lf = new loadingForm(); 
lf.Show(); 
//start downloading 
//finishdownloading 
lf.Close(); 

Die loadingForm aber die Fortschrittsbalken angezeigt wurde nicht angezeigt, und die Form sah aus wie es war zum Absturz bringen. Nach dem Download wurde die loadingForm geschlossen und meine App lief normal weiter. In loadingForm habe ich nur:

void loadingForm_Load(object sender, EventArgs e) 
{ 
    progressbar1.visible = true; 
} 

Ich habe bereits progressbar1 Stil auf Laufschrift in loadingForm.design gesetzt. Wie behebe ich das? Danke im Vorraus für deine Hilfe.

+1

Do * not * blockieren nach der Aufruf von lf.Show(). Verwenden Sie das BackgroundWorker.RunWorkerCompleted-Ereignis, um lp.Close() aufzurufen –

+0

Entschuldigung, aber könnten Sie Ihre Antwort erklären? Ich bin etwas neu im Programmieren. Was meinst du mit blockiere nicht? Und wie verwende ich den BackgroundWoker.RunWorkerCompleted, um den lf.Close aufzurufen? Vielen Dank. – PeteMerry

Antwort

3

Sie sollten sich die Verwendung von BackgroundWorker Class für die zeitraubenden Aktionen ansehen, damit die Benutzeroberfläche den Fortschritt weiterhin anzeigen kann, während der Hintergrund-Worker-Thread die Arbeit erledigt.

+0

Kann ich Hintergrund-Worker beim Laden des Formulars verwenden? weil ich in meiner MainForm die Download-Aktionen bereits in andere Threads einlege. (Ich starte einen neuen Thread für jeden Download vom Server zum Client, meine MainForm befindet sich in der Client-Anwendung). – PeteMerry

1

Dies ist höchstwahrscheinlich, weil der Download und das Formular mit der Fortschrittsanzeige auf dem gleichen Thread ausgeführt werden. Sie können eine BackgroundWorker verwenden, um den Download in einem anderen Thread als das Formular durchzuführen.

+0

danke für deine antwort. Wie ich im Kommentar frage, könnte ich stattdessen neues Formular auf einen anderen Thread laden? weil meine mainForm schon beim Erstellen eines neuen Threads mit jeder Verbindung zwischen Client und Server ein wenig umständlich ist. – PeteMerry

+0

Ja, Sie können ein Formular in einem neuen Thread erstellen. Sie müssen sicherstellen, dass eine Nachrichtenschleife ausgeführt wird, indem Sie entweder Application.Run aufrufen oder ShowDialog() im anderen Thread verwenden. – shf301

0

Der UI-Thread möglicherweise nicht "Ressourcen" haben die ui neu zu ziehen, sollten Sie den Hintergrund Arbeiter wie erwähnt verwenden oder verarbeiten, um die Anwendungsnachrichten in die Warteschlange. Von der Methode Show() bis zur Methode Close() sollten Sie Application.DoEvents() unbedingt aufrufen, damit alle Windows-Nachrichten verarbeitet werden (zusammen mit dem Neuzeichnen von Nachrichten in Ihrem Bewerbungsformular)

Verwandte Themen