Отправка больших файлов с помощью HttpWebRequest, увеличение/уменьшение буфера по мере необходимости

Я пишу приложение, которое загружает большие файлы в веб-службу, используя HttpWebRequest.

Это приложение будет запускаться разными людьми с разной скоростью интернета.

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

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

Проблема, с которой я столкнулся, заключается в выборе размера буфера. Если я сделаю его слишком большим, пользователи с медленным соединением не будут видеть частые обновления скорости. Если я сделаю его слишком маленьким, пользователи с быстрым подключением в конечном итоге будут «забивать» методы чтения/записи, что приведет к резкому увеличению загрузки ЦП.

Сейчас я запускаю буфер со 128 КБ, а затем каждые 10 операций записи я проверяю среднюю скорость записи этих 10 операций записи, и если она меньше секунды, я увеличиваю размер буфера на 128 КБ. Я также уменьшаю буфер аналогичным образом, если скорость записи падает ниже 5 секунд.

Это работает довольно хорошо, но все кажется очень произвольным, и кажется, что есть возможности для улучшения.У меня вопрос, кто-нибудь сталкивался с подобной ситуацией и как вы поступили?

Спасибо

6
задан NoPyGod 3 June 2012 в 04:53
поделиться