Potrzebuję wygenerować n losowych ciągów, a proces ten może chwilę potrwać i zablokować interfejs głównego wątku. Aby tego uniknąć i pozwolić użytkownikowi korzystać z programu podczas jego działania, postanowiłem użyć backGroundWorker
. Ale nie działało dobrze, a główny wątek nadal jest zablokowany. W moim DoWork
razie mam coś takiego:Kod uruchomienia bez głównego wątku bloku
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// using Invoke because I change value of some controls, e.g, ListView, labels and a progressbar
this.Invoke((Action)delegate
{
for (int i = 0; i < nSteps; ++i)
{
string s = getnStr();
// ...
int progress = (int)(100.0/nSteps * (i + 1));
backgroundWorker1.ReportProgress(progress);
}
});
}
Nawet chociaż ja nazywam ReportProgress()
wewnątrz pętli progressbar tylko zmienia swoją wartość, gdy pętla jest wykonywana.
Dlaczego tak się dzieje i jak mogę to naprawić?
Nie trzeba wywoływać, jeśli aktualizacja odbywa się w module obsługi zdarzeń Postęp. – alexm
I również etykiety pętli wewnątrz pętli. – Jack
Możesz zmienić etykiety za pomocą ReportProgress, a także podpowiedź: ma UserData – alexm