MaxSter
@MaxSter
Software engineer

Как увеличить количество выполняемых потоков?

Имеется приложение, которое выполяет загрузку файлов с сервера с помощью класса WebClient (задача учебная). Для обеспечения мультипоточности используются Thread, ThreadPool, BackgroundWorker, Delegate.BeginInvoke (способ выбирается пользователем). При запуске одновременно могут работать только две загрузки, остальные ждут в очереди. Как увеличить количество исполняемых потоков?
TPL не предлагать :)

public class Download : IManager
    {
        private Uri uri;
        private string file;
        public event EventHandler<DownloadInfoEventArgs> AlarmStartedDownload;
        public Download(Uri uri, string file)
        {
            this.uri = uri;
            while (true)
            {
                if (System.IO.File.Exists(file))
                {
                    file += "_";
                }
                else
                {
                    this.file = file;
                    break;
                }
            }
        }
        public string FileName
        {
            get { return file; }
        }

        public void StartDownload()
        {
            WebClient webClient = new WebClient();
            Thread thread = new Thread(()=> webClient.DownloadFileAsync(uri, file));   //запуск потока
            thread.Start();
            webClient.DownloadProgressChanged += (s, e) => OnAlarmDownloadStarted(e.ProgressPercentage);
        }
        public virtual void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)    //события, не обращайте внимания ;)
        {
            OnAlarmDownloadStarted(e.ProgressPercentage);
        }
        public virtual void OnAlarmDownloadStarted(int progress)
        {
            AlarmStartedDownload.Invoke(this, new DownloadInfoEventArgs(progress));
        } 
    }


Код с другими способами запуска мультипоточности, как вы понимаете, аналогичен.
  • Вопрос задан
  • 3295 просмотров
Решения вопроса 1
@smozhaykin
Зачем вручную создавать потоки, если используется DownloadFileAsync?

В этом примере проблема не в потоках, а в ограничении на число соединений. Изменить его можно в App.config:

<configuration>
  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "100" />
    </connectionManagement>
  </system.net>
</configuration>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@llirikkkk
В винде стоит ограничение на количество одновременно открытых tcp соединений.
Почитать вики: goo.gl/osI2h6
Один из варинтов фикса: half-open.com/home_ru.htm

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

И какой смысл делать так?
new Thread(()=> webClient.DownloadFileAsync(uri, file))

потому что
webClient.DownloadFileAsync(uri, file)
уже возвращает вам запущенный отдельный потоке по загрузке файла
у вас выходит -> создать новый поток, в котором создаётся новый поток выполняющий задачу.
используйте просто последний вариант.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы