Fortschrittsbalken während der Arbeit in C # anzeigen?

Ich möchte einen Fortschrittsbalken anzeigen, während ich etwas arbeite, aber dadurch hängt die Benutzeroberfläche und der Fortschrittsbalken wird nicht aktualisiert.

Ich habe eine WinForm ProgressForm mit einemProgressBar das wird auf unbestimmte Zeit in a fortgesetztFestzelt Mode.

using(ProgressForm p = new ProgressForm(this))
{
//Do Some Work
}

Jetzt gibt es viele Möglichkeiten, das Problem zu lösen, wie z. B. mitBeginInvokeWarten Sie, bis die Aufgabe abgeschlossen ist, und rufen Sie anEndInvoke. Oder mit demBackgroundWorker oderThreads.

Ich habe einige Probleme mit EndInvoke, obwohl das nicht die Frage ist. Die Frage ist, welches die beste und einfachste Art ist, mit solchen Situationen umzugehen, in denen Sie dem Benutzer zeigen müssen, dass das Programm funktioniert und nicht reagiert, und wie Sie mit möglichst einfachem Code umgehen, der effizient und erfolgreich ist. ' t auslaufen, und kann die GUI aktualisieren.

MögenBackgroundWorker muss mehrere Funktionen haben, Member-Variablen deklarieren usw. Außerdem müssen Sie dann einen Verweis auf das ProgressBar-Formular halten und es entsorgen.

Bearbeiten: BackgroundWorker ist nicht die Antwort, weil es sein kann, dass ich die Fortschrittsmeldung nicht erhalte, was bedeutet, dass es keinen Anruf zu geben gäbeProgressChanged als dieDoWork ist ein einzelner aufruf an eine externe funktion, aber ich muss den aufruf haltenApplication.DoEvents(); Damit sich der Fortschrittsbalken weiter dreht.

Die Prämie ist für die beste Codelösung für dieses Problem. Ich muss nur anrufenApplication.DoEvents() Der Marque-Fortschrittsbalken funktioniert, während die Worker-Funktion im Haupt-Thread ausgeführt wird, und es wird keine Fortschrittsbenachrichtigung zurückgegeben. Ich brauchte keinen magischen .NET-Code, um den Fortschritt automatisch zu melden. Ich brauchte nur eine bessere Lösung als:

Action<String, String> exec = DoSomethingLongAndNotReturnAnyNotification;
IAsyncResult result = exec.BeginInvoke(path, parameters, null, null);
while (!result.IsCompleted)
{
  Application.DoEvents();
}
exec.EndInvoke(result);

das hält den Fortschrittsbalken am Leben (bedeutet nicht einfrieren, sondern erfrischt die Marke)

Antworten auf die Frage(13)

Ihre Antwort auf die Frage