backgroundWorker i TextBox

0

Witam

Mam pytanie co robię, źle że w TextBox nie jest odświeżana wartość po każdej zmianie licznika?

public int licznik =0;
        private void button2_Click(object sender, EventArgs e)
        {
            this.backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            while(licznik <2147483645)
            {
                licznik++;
            }
        }
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            textBox2.Text = licznik.ToString();
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            textBox2.Text = licznik.ToString();
        }

Program działa, zwiększa licznik i po zakończeniu wyświetla wynik w TextBox. Jak powinno wyglądać prawidłowe użycie w takim przypadku backgroundWorker? Usunięcie pętli while nic nie zmienia za wyjątkiem tego, że licznik zwiększa się tylko raz o 1, nadal występuje kłopot z tym, ze private void backgroundWorker1_ProgressChanged nie jest wywoływana ani raz.

2

UI zawsze musisz aktualizowac w tym samym watku.

Dlatego nie dziala

0

A jak to zrobić bo chyba nie chodzi o refresh.

1

Uzyj async i await, najprościej.

0

Ale pokaż jeszcze jak masz podpięte zdarzenia do backgroundWorker1.
Ja zawsze robiłem według tego i mi działało:
http://www.altcontroldelete.pl/artykuly/implementacja-backgroundworker-w-wpf/

0

Szczerze to za dużo nie pomogło bo await można wywołać tylko w czyms co została wywołane i działa jako async a mimo wywołania backgroundWorker z async nie moża użyć await.
Na StackOverflow kombinują coś z await-em i async ale ciągle walczą z uchwytami i strumieniami a w moim przypadku jest to zbędne.

Gdzie zdarzenie powinno być podpięte? Komponent wrzucony na "formę" i użyty.

0

No to w panelu powinieneś podpiąć. A jak tworzysz ręcznie to jak w linku podanym

0
szydlak napisał(a):

No to w panelu powinieneś podpiąć. A jak tworzysz ręcznie to jak w linku podanym

Jest podpięty na panelu (graficznie) tworze w C# z formą.

0

Musisz ustawić coś takiego jak w linku reportprogress na true

1

Nie raportujesz nigdzie progresu. Dodaj:

backgroundWorker1.ReportProgress(licznik);

Lub jak podpowiadał kolega wyżej async/await:

 await Task.Run(() =>
            {
                while (licznik < 2147483645)
                {
                    licznik++;               
                    if (textBox2.InvokeRequired)
                    {
                        textBox2.Invoke(new Action(() => textBox2.Text = licznik.ToString()));                      
                    }
                    else textBox2.Text = licznik.ToString();
                }              
            });     

Polecam jeszcze: https://msdn.microsoft.com/pl-pl/library/hh193692(v=vs.110).aspx

0

No i to jest konkretna odpowiedz, dzięki której można zorientować się co gdzie się dzieje.
Dziękuję za pomoc.

0

Przerobiłbym tylko ten kod tak by dwa razy nie pisać tego samego textBox2.Text = licznik.ToString(); bo to się szybko zemści.

0

To był tylko przykład, na którym walczyłem docelowo będzie to zupełnie co innego.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.