Как я могу загрузить файл с помощью WebClient на С# с запуском обработчиков событий и поддержкой свойства тайм-аута?

Я разрабатываю проект С# для загрузки файлов из Интернета.

Я покажу их прогресс, пока идет загрузка. И я должен поддерживать свойство тайм-аута.

Я пытался использовать класс WebClient. Существуют функции DownloadFile() и DownloadFileAsync().

  • Когда я использую функцию DownloadFile(), я могу установить свойство Timeout, переопределяя функцию GetWebRequest(). Однако я не могу запускать обработчики событий, поэтому я не могу показать прогресс.
  • Когда я использую функцию DownloadFileAsync(), я могу запустить обработчики событий, чтобы показать прогресс. Но в этом случае я не могу установить тайм-аут.

В Интернете я могу найти несколько статей о том, как установить время ожидания вручную с помощью потоков.

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

Как я могу решить эту проблему?


person Yun    schedule 05.07.2012    source источник
comment
Как вы сгенерировали AsyncWaitHandle из вашего метода DownloadFileAsync или WebClient? Я пытаюсь загрузить несколько файлов в цикле, и мне интересно посмотреть, как вы решили свою проблему.   -  person Jeff Noel    schedule 25.07.2017


Ответы (2)


В соответствии с документацией MSDN по HttpWebRequest вам потребуется чтобы реализовать это самостоятельно, используя потоки.

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

Приведенная выше ссылка на самом деле дает полный пример того, как это сделать, используя пул потоков и ManualResetEvent (пример составляет около 50-100 строк кода).

Вот суть приведенного выше решения с кодом, приведенным в примере MSDN.

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

    Результат IAsyncResult = (IAsyncResult) myHttpWebRequest.BeginGetResponse (новый AsyncCallback (RespCallback), myRequestState);

  2. Используйте ThreadPool.RegisterWaitForSingleObject для реализации времени ожидания.

    ThreadPool.RegisterWaitForSingleObject (result.AsyncWaitHandle, новый WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true);

  3. Используйте ManualResetEvent, чтобы удерживать основной поток до тех пор, пока запрос не будет завершен или не истечет время ожидания.

    общедоступный статический ManualResetEvent allDone = новый ManualResetEvent (false); всеГотово.ЖдатьОдин();

person McGarnagle    schedule 05.07.2012

попробуй показать это

http://www.codeproject.com/Articles/35954/C-NET-Background-File-Downloader

person Alessio Koci    schedule 05.07.2012
comment
Поддерживает ли этот пример тайм-аут? Я не могу найти. - person Yun; 05.07.2012