2011-11-07 17 views
5

Chcę pobrać pojedynczy plik z wieloma wątkami w języku C#. np .: Wątek1 rozpoczyna pobieranie od 1% do 40%. Thread2 rozpocznij pobieranie od 41% do 70%. Wątek3 rozpoczyna pobieranie od 71% do 100%Jak pobrać pojedynczy plik z wieloma wątkami w języku C#

Proszę zasugerować mi kod. Z góry dziękuję

+2

Czy Twoje połączenie sieciowe jest w pełni wykorzystywane? Jeśli tak, nie możesz przyspieszyć pobierania z wieloma wątkami. –

+3

To nie pomoże. Doprowadzi to tylko do narzutu. –

+0

Dlaczego zakładasz, że to strona klienta/szerokość pasma jest problemem? Może to pomóc, jeśli serwer WWW używa pewnego rodzaju dławienia, które nie sprawdza, czy wiele połączeń pochodzi od tego samego klienta. – jgauffin

Odpowiedz

4

Jak na temat korzystania HttpRequest klasę z metodą AddRange nazwie. Powinno to być nagłówkiem z offsetem, od którego można rozpocząć pobieranie.

var request = HttpWebRequest.Create(new Uri("http://www.myurl.com/hugefile")); 

    request.Method = "GET"; 
    request.AddRange(offset_for_this_thread); // I assume you have calculated this 
               // before firing threads 
    Stream reponseStream = request.GetResponse().GetResponseStream(); 

Następnie można odczytać dane z "Response" i połączyć je z pozostałymi wątkami po zakończeniu.

Jednak, jak zauważyli wszyscy inni, przyniesie to wartość tylko wtedy, gdy masz dwa adaptery, oba podłączone do Internetu, i masz jakieś balansowanie pasma między tymi przejściami ... W przeciwnym razie Windows prawdopodobnie odwróci wszystko na to samo połączenie.

4

Robisz to za pomocą Range HTTP header. Pobierz każdą część do oddzielnego pliku i scalić je po zakończeniu (w celu uniknięcia problemów gwintowania wielo)

Aktualizacja

Najprostszym sposobem jest użycie jednego HttpWebRequest za wątku. Czytaj odpowiedź tutaj: HttpWebRequest or WebRequest - Resume Download ASP.NET

Aby scalić pliki, wystarczy przeczytać je w kolejności i zapis do nowego pliku (za pomocą FileStream klasę)

+0

Dzięki, to jest interesujące. –

+0

Przeczytaj moją aktualizację. – jgauffin

2

Urządzenie AddRange umożliwia pobieranie tylko zakresu. Spowoduje to ustawienie zakresu nagłówka HTTP, który powie serwerowi, że jesteś zainteresowany tylko pewnym zakresem. Dozwolonych jest wiele zakresów.

Niektóre osoby wspomniały, że ta metoda nie jest przydatna i spowoduje dodanie tylko narzutów. Imho to zależy od sytuacji, są to serwery, które rozsiewają tylko z prędkością X na połączenie. Niektóre będą filtrować na IP, inne tylko w aktywnym połączeniu. Tak więc w niektórych sytuacjach Twój scenariusz zadziałałby.

Powiązane problemy