BackgroundWorker komponenta omogućava jednostavan način za izvršavanje vremenski zahtevnih procesa u pozadini, omogućujući da korisnički interfejs bude raspoloživ za korisnika. Ova komponenta izvršava vremenski zahtevne operacije u posebnoj programskoj niti. Osnovna metoda ove komponente je RunWorkerAsync.

Pozivom metode RunWorkerAsync generiše se događaj DoWork. Kod u DoWork event hendleru se izvršava u posebnoj- rezervisanoj programskoj niti.


Svojstva BackgroundWorker(BW) komponente

CancellationPending svojstvo pokazuje da li aplikacija zahteva poništavanje pozadinskog procesa. IsBusy svojstvo govori da li BW izvršava asinhronu operaciju. WorkerReportsProgress svojstvo pokazuje da li BW komponenta može da da izveštaj o napredovanju posla. WorkerSupportsCancellation svojstvo govori da li BW komponenta podržava asinhrono poništavanje posla.


Metode i događaji BW komponente

CancelAsync metoda zahteva poništavanje pozadinske operacije. ReportProgress metoda generiše ProgressChanged događaj. Metoda RunWorkerAsync započinje izvršavanje pozadinskog procesa i generiše DoWork događaj. DoWork događaj se generiše nakon poziva RunWorkerAsync  metode, pri čemu se kod njegovog event hendlera izvršava u posebno - rezervisanom tredu. Događaj ProgressChanged se dešava kada se pozove ReportProgress metoda. Događaj RunWorkerCompleted se dešava kada se pozadinska operacija završi, poništi ili se generiše izuzetak.


Pokretanje pozadinskog procesa

private void button1_Click(object sender, EventArgs e)
{
    int i = Convert.ToInt32(textBox1.Text);
    backgroundWorker1.RunWorkerAsync(i);
}

Na formu je dodata BW komponenta. Unutar TextBox kontrole na formi upisuje se vreme trajanja simuliranog pozadinskoh procesa. Klikom na dugme Kreni poziva se metoda RunWorkerAsync ove komponente i metodi se kao parametar prosleđuje ceo broj koji predstavlja trajanje posla u sekundama.


DoWork event handler

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int i = Convert.ToInt32(e.Argument.ToString());
        for (int j = 1; j <= i; j++)
        {
            if (backgroundWorker1.CancellationPending)
            {
                // ako je stigao zahtev za ponistenje procesa izadji
                e.Cancel = true;
                return;
            }
            // spavaj 1 sec
            System.Threading.Thread.Sleep(1000);
            // generisi ProgressChanged dogadjaj
            backgroundWorker1.ReportProgress((int)((j * 100) / i));
        }
    }

Nakon pokretanja pozadinskog procesa generiše se događaj DoWork. Kod unutar ovog event handlera se izvršava ne u glavnoj programskoj niti već u posebno rezervisanoj programskoj niti. Korišćenjem objekta DoWorkEventArgs može se iščitati parametar koji je prosleđen metodi RunWorkerAsync, tj. metodi koja je započela pozadinski proces. For petlja unutar event hendlera ima onoliko ciklusa koliko je vreme trajanja procesa. Na početku svakog ciklusa, tj. svake sekunde, ispituje se da li je došlo da zahteva za poništenjem pozadinskog procesa. Ovo ispitivanje se vrši korišćenjem svojstva CancellationPending BW komponente. Sam proces se simulira korišćenjem Sleep metode klase Thread. Ovom metodom traži se neaktivnost programske niti u određeni broj  milisekundi. U našem primeru u svakom ciklusu traži se neaktivnost od 1000 ms tj. u trajanju od 1 sec. na kraju svakog ciklusa pozivom metode ReportProgress se generiše događaj ProgressChanged. Ovoj metodi se prosleđuje procentualni iznos izvršavanja pozadinskog procesa. Npr. ako je i=100, u prvom ciklusu j=1 pa se metodi prosleđuje vrednost (1*100)/100=1, u drugom ciklusu se metodi prosleđuje (2*100)/100=2 itd.


Obrada događaj ProgressChanged

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

Event hendleru događaja ProgressChanged prosleđuje se objekat klase. ProgressChangedEventArgs. Ova klasa ima svojstvo ProgressPercentage koje predstavlja procenat napredovanja posla. Procenat napredovanja posla prikazuje se korišćenjem ProgressBar kontrole.


Poništavanje pozadinskog procesa

private void button2_Click(object sender, EventArgs e)
{
    backgroundWorker1.CancelAsync();
}

Pozadinski proces se može poništiti u bilo kom trenutku njegovog izvršavanja. Dovoljno je da se na formu doda dugme Ponisti čijim će se klikom pozvati metoda CancelAsync odgovarajuće BW komponente.


Obrada događaja RunWorkerCompleted

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (!(e.Cancelled))
    {
 MessageBox.Show("Posao zavrsen!");
    }
    else
    {
 MessageBox.Show("Posao ponisten");
    }
}

Događaj RunWorkerCompleted se dešava kada se pozadinska operacija završi, poništi ili se generiše izuzetak. Unutar event handlera za događaj RunWorkerCompleted iščitava se objekat RunWorkerCompletedEventArgs koji sadrži informacije o stanju pozadinskog procesa. Pomoću svojstva Cancelled ispituje se da li je pozadinski proces prekinut.


Korisnički interfejs aplikacije

                                                 

Na slikama je prikazan korisnički interfejs aplikacije kojom se demonstrira rad sa BW komponentom.

Dodaj komentar Sviđa mi se - (0) Ne sviđa mi se - (0)    

  • BackgroundWorker komponenta 1
  • BackgroundWorker komponenta 2
  • BackgroundWorker komponenta 3