Obsluga watkow - backgroundworker

0

Witam mam problem z synchronizacją wątków.
Otóż napisałem program do kopiowania plików.

Chciałbym doda teraz taką funkcjonalnośc ,aby podczas operacji kopiowania wyskakiwało
okienko z jakimś napisem typu ("proszę czekac" ) lub progressbar.

I nie za bardzo wiem jak załatwic obsluge watkow.
Czy uzycie backgroudnworkera bedzie dobrym pomyslem ?
Wielkie dzieki za wszelka pomoc :)

0

Dokumentacja BackgroundWorker'a.

Video tutorial przedstawiajacy uzycie BackgroundWorker'a.

0

Możesz sobie stworzyć klasę, która dziedziczy po BackgrounWorker.
Następnie overridujesz metodę DoWork - dajesz tam całą logikę z kopiowaniem plików
teraz w obsłudze zdarzenia naciśnięcia przycisku wykonujesz następujące kroki:

  1. tworzysz nowy obiekt klasy, którą wcześniej zaimplementowałeś
  2. uruchamiasz wątek(RunWorkerAsync)
  3. wyświetlasz okno z progressbarem (form.ShowDialog())
0

Podpinam sie pod temat bo mam taki mały problem.
Zamysł programu był taki aby zmieniać nazwy plików mp3 na takie jakie są wpisywane w tagach.
W programie mamy 2 listboxy. Na jednym mamy liste plików i ich nazw przed zmianą a na drugim po zmianie.
Chciałbym skorzystać z backgroundworkera aby w zależności od ilości elementów w folderze, elementy były wyświetlane dynamicznie. W chwili obecnej wszystko działa, jednak ładowanie elementów na liste powinno być w teorii dynamiczne wraz z pobieraniem kolejnego pliku z folderu jednak lista sie rozwija ale trzeba poczekać do zakończenia działania programu aby elementy na liście sie zapełniły. Dlatego chce użyć backgroundwork.
Mam kod:

 
private void button1_Click(object sender, EventArgs e)
{
folderBrowserDialog1.ShowDialog();
temp = this.folderBrowserDialog1.SelectedPath;
nazwy = Directory.GetFiles(@temp);
foreach (string s in nazwy)
{ i++; }
progressBar1.Maximum = i;
progressBar1.Value = 0;
foreach (string s in nazwy)
{
tytullistbox1 = s;
if (backgroundWorker1.WorkerSupportsCancellation == true)
{ backgroundWorker1.CancelAsync();}
backgroundWorker1.RunWorkerAsync();

...
}

To główna część kodu która znajduje sie pod buttonem.

Teraz co do backgroudworkera

 
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            if (worker.CancellationPending == true)
            {
                e.Cancel = true;
                Application.Exit();
            }
            else
            {
                progressBar1.Value += 1;
                listBox1.Items.Add(tytullistbox1);
            }

        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            listBox1.Items.Add(tytullistbox1+"progresschanged");
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                
            }
            else if (e.Error != null)
            {
                listBox1.Text = "Error: " + e.Error.Message;
            }
            else
            {
                listBox1.Text = "Done!";
            }

        }

I dostaje ciągle w miejscu:

backgroundWorker1.RunWorkerAsync(); 

Ten proces BackgroundWorker jest aktualnie zajęty, a nie można wykonywać wielu zadań jednocześnie.
Nie powinna

if (backgroundWorker1.WorkerSupportsCancellation == true)
{ backgroundWorker1.CancelAsync();} 

zabijać te procesy?

Czy też ja źle korzystam z backgroundworkera?

1 użytkowników online, w tym zalogowanych: 0, gości: 1