[C#] Background worker problem

0

Mam listę plików w listBox1.
Chciałbym, żeby program czekał aż zakończy się procedura backgroundWorker1
i pobrał kolejny element z listy(plik) dopiero po wykonaniu procedury backgroundWorker1-a.
W Threads jest "Join", a jakie są możliwości daje komponent background . IsBusy?? ale możejest coś lepszego
Dzięki za pomoc.

 foreach (string Fn in listBox1.SelectedItems)
            {
                        backgroundWorker1.RunWorkerAsync();
            }
0

A popatrzyles chociaz na zakladke ze zdazeniami ?! >>>> RunWorkerCompleted

Co prawda nie do konca jest jasne co chesz wykonac, bo wyglada na to ze i tak chcesz zatrzymac watek glowny (no mam nadzieje, ze nie ten sam i czekac az sie odblokuje).

0

Tak chce zatrzymać wątek główny..
Nie mam problemu z obsługą komponentu. Wkleiłem tylko dla uproszczenia kawałek kodu, żeby problem był jasno sprecyzowany, bo mój kod jest dość skomplikowany...

Wątek główny (forma) powinien czekać na zakończenie background workera i wtedy nazwa kolejnego pliku powinna być pobrana z listBox1

.. ale nie wiem jak to zrobić mogę zapętlić z użyciem isBusy

0

jeżeli co krok będziesz pobierał coś z listy, to będziesz miał dużo odwołań między wątkami. Tzn. że jeżeli będziesz odwoływać się powiedzmy 100 razy na sekundę do listy, to Twój BackGroundworker nic Ci nie da. Bo po prostu będzie on zamulać wątek GUI tymi odwołaniami.

Wydziel listę plików do oddzielnej struktury np. List<string> i przekaż całą listę do Workera. Worker będzie pobierał z listy pierwszy element, wykonywał robotę, na koniec kasował pierwszy element z listy i pobierał następny i wykonywał kolejną robotę i tak do zakończenia się plików na liście.

0
TomaszSmykowski napisał(a)

Wydziel listę plików do oddzielnej struktury np. List<string> i przekaż całą listę do Workera. Worker będzie pobierał z listy pierwszy element, wykonywał robotę, na koniec kasował pierwszy element z listy i pobierał następny i wykonywał kolejną robotę i tak do zakończenia się plików na liście.

Mi to wygląda na kolejkę, ale ja się na strukturach danych nie znam ^^

0

FIFO - First in First Out.

Chociaż można też użyć FIRO (ale daje nieprzewidziane skutki ;)

0

Po prostu użycie listy w tym przypadku jest lekko bez sensu.

0

Chyba ucięło Ci posta, bo to co z niego zostało jest bez sensu.

0

To przekaż background workerowi kopię całej listy raz i po krzyku. Nie rób Join'a tylko skorzystaj ze zdarzenia RunWorkerCompleted jak już wszystkie pliki będą gotowe.
Poza tym do asynchronicznego zapisu/odczytu pliku background worker nie jest potrzebny (nie wiem czy akurat to jest sedno twojego workera):
http://msdn.microsoft.com/en-us/library/system.io.filestream.beginwrite.aspx

0
TomaszSmykowski napisał(a)

Chyba ucięło Ci posta, bo to co z niego zostało jest bez sensu.

Nie - nie ucięło, po prostu leniwy jestem i gdybym miał potrzebę przetwarzania czegoś po kolei, to użyłbym Queue, a nie List, żebym nie musiał sam usuwać ;)

0

Ano [wstyd]

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