[C#]DownloadFileAsync - 1 na raz

[C#]DownloadFileAsync - 1 na raz
pret0rian
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 10 lat
0

Poniższy kod mam puszczony w forze - 14 razy. Problem jest taki, że pobiera 2 pliki na raz, resztę wrzuca do kolejki.
Przez to, że pobiera 2 na raz, progressbar mi szaleje między tymi 2 plikami. Da się jakoś ograniczyć być pobierał 1 na raz?

Kopiuj
            try
            {
                WebClient wc = new WebClient();
                string url = webpath;
                wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
                wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
                wc.DownloadFileAsync(new Uri(url), path);
            }
            catch
            {
                MessageBox.Show("Błąd przy pobieraniu: \n" + pbo, "Komunikat!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

"Jeśli udoskonalasz coś dostatecznie długo – na pewno to zepsujesz."
edytowany 2x, ostatnio: pret0rian
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 4 godziny
0

Ponieważ każdy plik ściągasz osobnym WebClientem, możesz je rozróżniać po parametrze sender wewnątrz zdarzeń.

pret0rian
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 10 lat
0

W jaki sposób z tego skorzystać? Jeżeli chodzi o asynchroniczne i wielowątkowe funkcje to raczej słabo mi idzie.
Chce jedynie coś zrobić, żeby pobierało 1 na raz, nie 2. Gdybyś był łaskaw wstawić część kodu która by to umożliwiła, to bym był wdzięczny. Po kolei bym go sobie prześledził.


"Jeśli udoskonalasz coś dostatecznie długo – na pewno to zepsujesz."
edytowany 1x, ostatnio: pret0rian
Azarien
Moment. Chcesz spowolnić cały proces, tylko dlatego, że masz problem z wyświetlaniem postępu, gdy są dwa pliki na raz?
pret0rian
Pobieranie 1 pliku na raz czy 2 to nie swpolonienie. I tak jesteś uzależniony od prędkości internetu, więc wychodzi na to samo.
Azarien
różnie z tym bywa, bo nie zawsze wąskie gardło jest po twojej stronie
pret0rian
To mógłbyś mi podpowiedzieć w takim razie jak pobrać 14 plików, one by one tak, żebym mógł z nich bez problemu wydobyć ile pobrałem, ile jest do pobrania.
pret0rian
Ewentualnie jak mam rozdzielić ten event progresschanged na 2 progressbary, bo nie mam pojęcia jak to zrobić. e.UserState zmienia się w ułamku sekundy pomiędzy tymi 2 pobraniami...
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 4 godziny
0

Jeśli chcesz żeby było synchronicznie, to nie używaj asynchronicznych funkcji...

Używając DownloadFileAsync ogłaszasz, że nie interesuje cię (i nie masz wpływu) ile plików idzie na raz.

edytowany 1x, ostatnio: Azarien
pret0rian
Jakiś pomysł jak to rozwiązać bez blokowania programu?
NE
Osobny wątek?
pret0rian
A będę mógł wciąż pokazywać dane na progressbarze?
S2
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 6 lat
  • Postów:17
1

Witaj,
Nie wiem czy dalej cie to interesuje, ale wydaje mi się że chodzi ci o to żeby pobrać jeden plik a po jego zakończeniu pobrać kolejny wiec nie powinieneś ładować tego kodu do for-a bo wykona się 14 razy i uruchomi 14 wątków z którego każdy będzie chciał dostać się do serwera i pobrać jeden plik. Wiec to co musisz zrobić to uruchomić twój kod raz a następnie poczekać na wystąpienie event-u DownloadFileComplited i tam ponownie uruchomić DownloadFileAsync i tak w kółko aż pobierzesz wszystkie pliki.

edytowany 1x, ostatnio: stanley21
pret0rian
Dobry pomysł, dzięki.

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.