2010-11-28 2 views
2

Я хочу загрузить файл во время отображения в пользовательском интерфейсе, который выполняется загрузка. С WebRequest У меня есть два варианта:Thread.Start (WebRequest.GetResponse) vs. WebRequest.BeginGetResponse

  1. Использование WebRequest.BeginGetResponse и связанные с ними методы.

    Преимущество: возможность отображения точного хода в байтах.

    Недостаток: больше кода для написания. Поскольку синхронные и асинхронные методы не смешиваются, мне нужно будет использовать BeginGetResponse, BeginRead, BeginGetRequestStream. Больше вещей для реализации вручную, включая буферы чтения, тайм-ауты.

  2. Создать новую тему (или использовать пул потоков), используйте WebRequest.GetResponse и связанные с этим методы.

    Преимущество: нет лишнего кода.

    Недостаток: невозможно показать точный прогресс.

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

Или, может быть, есть более широко распространенная обертка, которую я пропустил? (WebClient не выставляет WebRequest, так что это непригодно для меня, потому что мне нужно использовать файлы cookie и т. Д.)

+0

Почему невозможно показать точный прогресс? – 2010-11-28 21:21:56

+0

@HPT Я думаю, что `GetResponse` возвращается только тогда, когда запрос полностью выполнен. Таким образом, это 0%, прежде чем называть его и на 100% после, ни с чем между ними. Я ошибаюсь? – Athari 2010-11-28 21:28:36

ответ

4

Если вы создаете новый поток (опция № 2), этот поток будет блокироваться при выполнении запроса. Если вы делаете только один запрос за раз, что не имеет большого значения, но если вы выполняете множество запросов, вы можете столкнуться с большим количеством дополнительных потоков. Каждый поток будет стоить вам ~ 1 МБ ОЗУ.

Асинхронные вызовы, такие как WebRequest.BeginGetResponse, не будут блокировать ни один из ваших потоков во время выполнения запроса, он будет выбирать поток из пула потоков, когда ваш запрос будет завершен, чтобы доставить результат.