Po pierwsze:
Kopiuj
Synchro s = new Synchro();
</quote> Tworzysz NOWY OBIEKT klasy synchro (twojej formy z progressbarem)
Kopiuj
s.pUpdate(progress);
</quote> Robisz update na NOWYM OBIEKCIE klasy synchro, TO NIE ZMIENI niczego na twojej formie glownej.
Po drugie: chyba nie zrozumiałeś do końca istoty działania BW.
Moja rada jest taka: daruj sobie BW w formie, skoro chcesz żeby cała operacja była wykonywana w klasie Downloader, to tam utwórz sobie BW. Definicja DoWork bedzie w klasie Downloader, a w klasie Synchro ustawisz tylko ProgressChanged i RunWorkerCompleted tegoż BW. Dzięki temu Downloader będzie wykonywał swoją operację, w międzyczasie raportował progres do formy głównej(bez brutalnego dłubania w jej zmiennych), a po zakończeniu operacji zaraportuje koniec pracy.
Nie wiem czy to pominąłeś w umieszczonym tu kodzie, czy nie masz tego u siebie, ale musisz ustawić jeszcze dwie flagi na true: WorkerSupportsCancellation(żeby można było anulować BW) i WorkerReportsProgress(żeby można było raportować postęp) bez tego dostaniesz wyjątkami po oczach ;) Dodatkowo używając tego
Kopiuj
if ((bWsynchro.CancellationPending == true))
{
e.Cancel = true;
}
w tym miejscu gdzie użyłeś nic ci nie da. Sprawdzanie tej flagi powinieneś wstawić w miejsce tej pętli:
Kopiuj
for (int i = 0; i < k; i++)
{
progress = Convert.ToInt32(Math.Round(licznik * 100.0 / n, 2));
}