2012-06-30 2 views
3

У меня пользовательский элемент управления, который имеет метод, как этотМаксимальное количество резьбы

public void DownloadFileAsync() 
    { 
     ThreadStart thread = DownloadFile; 
     Thread downloadThread = new Thread(thread); 

     downloadThread.Start(); 
    } 

В форме у меня 4 пользовательский элемент управления, как это. Но когда я вызываю в пользовательский элемент управления DownloadFileAsync() для каждого элемента управления, только два из них начинают загружаться. По окончании одного из них начинается загрузка.

В чем проблема и как я могу загрузить одновременно каждую загрузку?

Благодарим за внимание.

public void DownloadFile() 
    { 
     int byteRecieved = 0; 
     byte[] bytes = new byte[_bufferSize]; 

     try 
     { 
      _webRequestDownloadFile = (HttpWebRequest)WebRequest.Create(_file.AddressURL); 
      _webRequestDownloadFile.AddRange((int)_totalRecievedBytes); 
      _webResponseDownloadFile = (HttpWebResponse)_webRequestDownloadFile.GetResponse(); 
      _fileSize = _webResponseDownloadFile.ContentLength; 
      _streamFile = _webResponseDownloadFile.GetResponseStream(); 

      _streamLocalFile = new FileStream(_file.LocalDirectory, _totalRecievedBytes > 0 ? FileMode.Append : FileMode.Create); 

      MessageBox.Show("Salam"); 
      _status = DownloadStatus.Inprogress; 
      while ((byteRecieved = _streamFile.Read(bytes, 0, _bufferSize)) > 0 && _status == DownloadStatus.Inprogress) 
      { 

       _streamLocalFile.Write(bytes, 0, byteRecieved); 

       _totalRecievedBytes += byteRecieved; 

       if (_totalRecievedBytes >= _fileSize) 
       { 
        argsCompleted.Status = DownloadStatus.Completed; 
        if (_fileDownloadCompleted != null) 
         _fileDownloadCompleted(_file, argsCompleted); 
        break; 
       } 

       argsProgress.UpdateEventArgument(DownloadStatus.Inprogress, _totalRecievedBytes); 

       if (_fileDownloadProgress != null) 
        _fileDownloadProgress(_file, argsProgress); 



      } 
     } 
     catch (Exception ex) 
     { 
      LogOperations.Log(ex.Message); 
     } 
     finally 
     { 
      _streamFile.Close(); 
      _streamFile.Close(); 
      _streamLocalFile.Close(); 
      _webResponseDownloadFile.Close(); 
     } 
    } 
+0

Вы пытаетесь скачать из нескольких разных мест? Или вы пытаетесь загрузить большое количество вещей из того же места? –

+0

Я пытаюсь загрузить с одного сервера IIS 4 разных вещи –

+1

Не могли бы вы включить DownloadFile() body? – alexm

ответ

11

HTTP имел предел 2 соединения на Web Origin в течение очень долгого времени, так что люди не начинают слишком много загрузок параллельно. Это ограничение было отменено, но многие реализации, включая HttpWebRequest, все еще реализуют его.

От draft-ietf-httpbis-p1-messaging:

Клиенты (включая прокси) следует ограничить количество одновременных соединений, которые они поддерживают на данном сервере (включая прокси).

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

Вы можете изменить лимит подключений, установив ConnectionLimit Property следующим образом:

HttpWebRequest httpWebRequest = (HttpWebRequest)webRequest; 
httpWebRequest.ServicePoint.ConnectionLimit = 10; 

Не устанавливайте предел слишком высокий, так что вы не перегружать сервер.

Кроме того, вместо использования потоков вы должны использовать WebClient Class и асинхронные методы, которые он предоставляет (например, DownloadDataAsync Method). См. How can I programmatically remove the 2 connection limit in WebClient о том, как изменить ограничение соединения здесь.

+0

Спасибо. Это помогло мне. –

+0

@Tabriz Atayi: Не забудьте отметить ответ как принятый, если он решит вашу проблему. – Tudor

Смежные вопросы