Form Reagiert Nicht wenn eine andere operation, die in C#
Ich habe ein Formular (Entwickelt in C# unter VS2010) mit einer Fortschrittsanzeige.
Es ist eine Art Stoppuhr Formular wo ich ausfüllen der Fortschrittsbalken sagen 10secs.... Wie die Zeit vergeht, Fortschrittsbalken füllt sich entsprechend.... Bedeutet nach 5secs, Fortschrittsbalken gefüllt werden 50% und so weiter....
Habe ich eine for-Schleife, um diesen Vorgang auszuführen:-
for(int count=0;count<200;count++)
{
progbar.performstep();
progbar.update();
update();
Thread.Sleep(50);
}
Ich verwendet habe-Thread.Schlaf von 50msec so, dass progress bar updates reibungslos.
Für 1sec, erhöht sich in Schritten.
Problem ist, wenn ich tun anyother operation wie das Verschieben dieses Formular oder sogar ein Klick auf ein anderes icon auf dem Desktop macht diese form "Reagiert Nicht".... Aber es singt der operation und am Ende von 10 Sekunden, Es gewinnt, es ist Zustand und zeigt die pop-up-Anzeige-10secs vergangen sind mit Fortschrittsbalken Voll ist.
Danke für die Hilfe und Sorry für die Verwendung dieser komplizierten Sprache.
Grüße,
Swanand
Update: ich löste dieses problem mit Hilfe der Antworten unten.... Ein häufiger Fehler, die ich kennenlernte, ist, zu vergessen "Applications.DoEvents()
" zusammen mit "update()
".... Wenn Sie in diese Zeile, gibt es weniger Chancen, die "gehängt"!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist der Durchführung einer long-running-operation auf dem UI-thread, was bedeutet, dass die UI "message loop" (verantwortlich für die Behandlung der Ereignisse, wie Benutzereingaben und die Aktualisierung des Bildschirms) nicht die chance bekommen, zu laufen.
Sollten Sie den lang Laufenden Betrieb auf einen anderen thread (egal ob man Sie selbst erstellen oder einen hintergrund-thread) und verwenden Sie entweder
BackgroundWorker
ganz einfach aktualisieren Sie Ihre Fortschritte bar, oder verwenden SieControl.Invoke/BeginInvoke
marshall ein Delegat-Aufruf zurück an den UI-thread, wenn Sie brauchen, um die Aktualisierung der Benutzeroberfläche. (Man darf nicht aktualisieren Steuerelemente aus der falsche thread.)Wenn Ihr nur UI-Interaktion ist das ausfüllen einer progress bar, ich schlage vor, mit
BackgroundWorker
.Wenn Sie nicht wirklich tun "eigentliche" Arbeit, die nur darauf warten für die Zeit vergeht, könnten Sie ein
System.Windows.Forms.Timer
statt alle diesem, jedoch. Den "tick" auf dem UI-thread, aber nicht blockieren den UI-thread zwischen ticks. Verwenden Sie diese nur, wenn Sie nicht haben eine Menge Arbeit zu tun, aber - wenn es wirklich ist nur die Aktualisierung einer Fortschrittsanzeige, die nicht (sagen) mit der Verarbeitung einer Datei usw. Beachten Sie, dass Sie sollten nicht darauf verlassen, dass der timer feuern genau "on time" - sollten Sie wahrscheinlich wählen Sie die position der progress bar basiert auf der beobachteten Zeit, sondern als die beobachtete Zahl der Zecken.Sind Sie die Blockierung der UI-thread, was bedeutet, es ist nicht die Verarbeitung von Ereignissen wie "paint". Um dies richtig tun, sollten Sie mit so etwas wie
BackgroundWorker
, und nur die Aktualisierung der Benutzeroberfläche von das progress-Ereignis.RunWorkerAsync
, oder verwenden Sie eineTimer
wie @Jon vorgeschlagenEnabled = false
für ein paar Sekunden.Sind Sie blockiert den Main-UI-thread. Sie können einen hintergrund-Arbeiter, dies zu tun. Sie können weitere details finden Sie im MSDN
Antwort vorgeschlagen Marc helfen. Lon Laufenden Betrieb können Sie Ihre Anwendung abstürzt oder nicht mehr reagiert. Ich habe ein blog-post bezüglich der Nutzung der hintergrund-worker-Klasse.
http://midnightprogrammer.net/post/Using-Background-Worker-in-C.aspx
Wenn Sie möchten, führen Sie den code solltest du diesen code in eine Funktion und rufen diese Funktion mit einem thread.
b'caz Thread.sleep(100) wird, Stoppt der ganze Zusammenhang nicht, dass insbesondere Sie wollen..