Thread.Start (WebRequest.GetResponse) против WebRequest.BeginGetResponse - PullRequest
2 голосов
/ 29 ноября 2010

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

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

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

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

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

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

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

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

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

1 Ответ

4 голосов
/ 29 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...