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ę)

questionAnswers(13)

yourAnswerToTheQuestion