Wyświetl pasek postępu podczas wykonywania pracy w języku C #?
Chcę wyświetlać pasek postępu podczas wykonywania pracy, ale to spowoduje zawieszenie interfejsu użytkownika, a pasek postępu nie zostanie zaktualizowany.
Mam ProgressForm WinForm zProgressBar
który będzie trwał w nieskończonośćduży namiot moda.
using(ProgressForm p = new ProgressForm(this))
{
//Do Some Work
}
Teraz istnieje wiele sposobów rozwiązania tego problemu, takich jak używanieBeginInvoke
, poczekaj na zakończenie zadania i zadzwońEndInvoke
. Lub za pomocąBackgroundWorker
lubThreads
.
Mam pewne problemy z EndInvoke, choć nie o to chodzi. Pytanie brzmi, jaki jest najlepszy i najprostszy sposób, w jaki radzisz sobie z takimi sytuacjami, w którym musisz pokazać użytkownikowi, że program działa i nie odpowiada, i jak sobie z tym poradzić, stosując możliwie najprostszy kod, który jest wydajny i wygrany ” t wyciek i może zaktualizować GUI.
LubićBackgroundWorker
musi mieć wiele funkcji, zadeklarować zmienne składowe, itp. Ponadto musisz następnie odwołać się do formularza ProgressBar i pozbyć się go.
Edytować: BackgroundWorker
nie jest odpowiedzią, ponieważ może się zdarzyć, że nie otrzymam powiadomienia o postępie, co oznacza, że nie będzie żadnego połączeniaProgressChanged
jakDoWork
to pojedyncze wywołanie funkcji zewnętrznej, ale muszę nadal dzwonićApplication.DoEvents();
aby pasek postępu obracał się.
Nagroda dotyczy najlepszego rozwiązania kodu dla tego problemu. Muszę tylko zadzwonićApplication.DoEvents()
tak, aby pasek postępu Marque działał, podczas gdy funkcja robotnicza działa w wątku głównym i nie zwraca żadnego powiadomienia o postępie. Nigdy nie potrzebowałem kodu magicznego .NET do automatycznego raportowania postępu, potrzebowałem tylko lepszego rozwiązania niż:
Action<String, String> exec = DoSomethingLongAndNotReturnAnyNotification;
IAsyncResult result = exec.BeginInvoke(path, parameters, null, null);
while (!result.IsCompleted)
{
Application.DoEvents();
}
exec.EndInvoke(result);
który utrzymuje pasek postępu przy życiu (oznacza nie zamrażanie, ale odświeża markę)