Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# - Pobieranie plików z internetu

Przemo_2014 18 Kwi 2013 09:44 1485 3
  • #1 18 Kwi 2013 09:44
    Przemo_2014
    Poziom 19  

    witam,

    Do pobieranie plików z internetu wykorzystuje kod:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Funkcje ta wykonuje się dla danego przedziału dat dla każdego dnia z osobna. Dla każdego dnia pobierany jest plik o wielkości ok 18kB. Przy próbie pobrania ok. 300 plików program wykonuje się w miarę szybko po czym w katalogu gdzie są zapisywane pliki są dostępne dopiero po jakiś czasie jeden za drugim pomimo że program skończył działanie. Czym to jest spowodowane ?

    Pozdrawiam

    0 3
  • #2 18 Kwi 2013 23:21
    gitara61
    Poziom 10  

    Nigdy nie korzystałem z tych metod, więc moja odpowiedź jest jedynie przypuszczeniem, które może cię nakierować (może się przyda).
    Nazwa metody DownloadFileAsync wskazuje na to, że pliki są pobierane asynchronicznie. Z tego można wywnioskować, że dla każdego pliku twój program tworzy jakiś osobny "tunel" lub wątek. Program zakończy działanie dość szybko, bo utworzenie kolejnych "tuneli" zajmuje mu mało czasu. Nie napisałeś czy te pliki pojawiają się jakiś czas po zamknięciu programu, czy po zakończeniu jego pracy (ale program pozostaje uruchomiony). Jeżeli występuje ten drugi przypadek, to najprawdopodobniej program tworzy wątki pobierania działające w tle.
    Aby sprawdzić czy moje rozumowanie ma jakiś sens sprawdź obciążenie sieci przed uruchomieniem programu, w trakcie jego działania i po zakończeniu jego działania. Dokonać tego możesz przy pomocy menedżera zadań windows, zakładka sieć. Jeżeli po zakończeniu działania programu obciążenie nadal jest duże (większe niż przed jego uruchomieniem) to teoria z osobnymi tunelami lub wątkami jest prawidłowa.

    0
  • #3 19 Kwi 2013 12:43
    Przemo_2014
    Poziom 19  

    Wygląda na to że dla każdego pliku jest tworzony osobny wątek które wykonują się jeden po drugim. Gdy wyłączę aplikacje w docelowym folderze widnieją wszystkie pliki lecz nie wszystkie zajmują jakąś pamięć. W jaki sposób mogę zatem wykonać jakąś operację po każdym pobraniu pliku ? A dokładniej chodzi w jaki sposób sprawdzić kiedy dany wątek skończył działanie.

    0
  • #4 19 Kwi 2013 15:48
    gitara61
    Poziom 10  

    Z tego co mówi MSDN widzę dwa rozwiązania. Albo używasz metody DownloadFile, wtedy pobieranie plików będzie następowało kolejno, a w czasie pobierania każdego z plików program będzie wstrzymany, bo jest to metoda blokująca wątek wywołujący (domyślam się, że w twoim przypadku jest to wątek główny).
    Druga metoda to użycie metody DownloadFileAsync i oprogramowania zdarzenia DownloadFileComplited. Poniżej przykładowy działający kod.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0