Хобрук: Ваш путь к мастерству в программировании

Регулирование пропускной способности с помощью WebClient

Погуглив, я обнаружил, что нет способа ограничить скорость загрузки в классе WebClient.

Итак, теперь я думаю о том, чтобы поставить Thread.Sleep() в метод DownloadFileAsync() DownloadProgressChangedEventHandler.

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

Допустим, есть два загрузчика. Первый скачивает 50 байт в секунду. Второй скачивает 100 байт за 2 секунды. Тогда оба 50Bps.

Как вы знаете, то, что я пытаюсь сделать с WebClient, это второй способ. Скачав 100 байт, заснуть на секунду, а затем загрузить 100 байт и снова заснуть на секунду...

Подойдет ли мой подход?


  • Вы можете посмотреть очень хороший пример регулирования пропускной способности по адресу codeproject.com/Articles/18243/Bandwidth. -дросселирование 24.12.2015
  • @VIVEK Я уже прочитал это, но пока нужно придерживаться DownloadFileAsync() из WebClient. Спасибо хоть! 24.12.2015
  • Вы не можете ограничить DownloadFileAsync. Вы можете сделать что-то на сетевом уровне, но это будет бестолково. Предложите вам попробовать перенести свой код на фрагментированную загрузку, которой вы можете управлять. 24.12.2015
  • @MurrayFoxcroft Спасибо! Что вы думаете о моем подходе выше? Это плохая идея? 24.12.2015
  • Попробуйте, но я сомневаюсь, что это что-то изменит. Обработчик событий - это просто событие, и я не вижу в вашем обработчике ничего, что блокировало бы фактический поток загрузки. Почему бы не использовать альтернативный подход — что мешает вам сделать что-то вроде codeproject.com/Articles /18243/Ограничение пропускной способности 24.12.2015
  • @MurrayFoxcroft Ну, вызов Thread.Sleep(x) в методе события DownloadFileAsync() может удерживать поток загрузки для x. Я проверил это и получил то, что ожидал, как я описал выше. Но я не уверен, что это хороший способ сделать. Что касается вашего вопроса, конечно, я тоже могу попробовать, но пока это требует времени. 24.12.2015
  • Вы уверены, что он содержит поток загрузки (фактическая загрузка файла), а не только отчет о ходе выполнения? Если это работает, и это быстрое и грязное приложение для выброса, то придерживайтесь его. Если вы создаете что-то, что планируете использовать в течение некоторого времени, я бы выбрал более аккуратный подход. 24.12.2015
  • @MurrayFoxcroft Что касается вашего вопроса, да! Поэтому мы не должны размещать там какие-то тяжелые работы вообще. А что касается вашего предложения, я тоже согласен, спасибо :) 24.12.2015

Ответы:


1

Я пробовал с решением Thread.Sleep(x)... если вы установите длительный сон и увидите в диспетчере задач сетевой монитор... вы увидите, что приложение потребляет полную пропускную способность и не удерживает поток загрузки .

16.06.2016
  • Что ж, попробуйте еще раз с файлом большого размера. Я почти уверен, что если вы поместите бесконечный цикл в метод DownloadProgressChangedEventHandler, вы никогда не получите полный файл из потока загрузки. Но я знаю, что вы имеете в виду. Когда ваша программа только начала загрузку, она загрузит некоторое количество данных с полной пропускной способностью, но после этого она остановится. Вот почему я сказал, что вы должны попробовать с большим файлом. 19.06.2016
  • Я знаю, что слишком поздно отвечать, но тогда я загружал файл размером 6 ГБ с одного из наших серверов. 23.10.2019
  • Вау, очень поздний ответ! Я совсем забыл об этом, лол. Да, ты прав. Во-первых, сразу после публикации этого вопроса я понял, что этот подход изначально глуп и бесполезен. А во-вторых, я нашел ошибку в своем тестовом коде и неправильно ее истолковал. 23.10.2019
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..