Как открыть несколько соединений, чтобы скачать один файл? - PullRequest
3 голосов
/ 06 декабря 2011

Я знаю, что некоторые серверы не позволяют этого, но некоторые поддерживают несколько соединений. Я могу загрузить файл по частям и объединить их после загрузки последней части, так как я использую отдельный фоновый рабочий для каждой части файла ... поэтому он медленный и загружает по одной части файла за раз. Я хочу начать загрузку каждой части файла сразу. Но я не знаю, как это сделать. Подскажите, какой метод быстрее и как их использовать.

Backgroundworker
Threads
ThreadPool

Спасибо за вашу помощь.

1 Ответ

11 голосов
/ 06 декабря 2011

Если вы загружаете свой файл в HTTP, вы можете использовать этот метод:

http://msdn.microsoft.com/en-us/library/7fy67z6d.aspx

Таким образом, вам придется разделить ваш файл на несколько временных файлов, а затем объединитьих.

Но вы должны быть уверены, что эта функция включена на стороне сервера (я не знаю, по умолчанию ли она).

И, как некоторые говорили, выПроизводительность увеличится, поэтому Free Download Manager так полезен: он загружает несколько частей вашего файла одновременно.

Чтобы сделать это с несколькими потоками:

class FileDownloader{
int Start;
int Count;
string PathTemp;
string Url;
FileDownloader(url,start,count){
url = Url;
Start =start;
Count = count;
PathTemp = Path.GetTempFileName()
}
void DoDownload(){
//do your thing with stream and request and save it to PathTemp
}
}

Здесьваш код для инициализации списка загрузчиков:

List<FileDownloader> filewonloadersList = new ListFileDownloader>();
System.Net.WebRequest req = System.Net.HttpWebRequest.Create("http://stackoverflow.com/robots.txt");
req.Method = "HEAD";
System.Net.WebResponse resp = req.GetResponse();
int responseLength = int.Parse(resp.Headers.Get("Content-Length"));
for(int i = 0;i<response.Length;i = i + 1024){
filewonloadersList.Add(new FileDownloader("http://stackoverflow.com/robots.txt",i,1024));
}

И ваша программа инициализирует X FileDownloader в списке (здесь не указана эта логика, я сосредотачиваюсь на мелочах)

List<Thread> threadList = new List<Thread>();
foreach(FileDownloader aFildeDownloader in filewonloadersList)
{
    Thread aThread = new Thread(aFildeDownloader.DoDownload) //this method will be called when the thread starts
    threadList.Add(aThread);
    aThread.Start();
}


foreach(Thread aThread in threadList)
{
    aThread.Join();//will wait until the thread is finished
}
//all the downloader finished their work now you can go through your downloader list and concatenante the temps files
...