Установите время ожидания для webClient.DownloadFile () - PullRequest
88 голосов
/ 02 марта 2009

Я использую webClient.DownloadFile() для загрузки файла. Могу ли я установить тайм-аут для этого, чтобы он не занимал так много времени, если он не может получить доступ к файлу?

Ответы [ 3 ]

251 голосов
/ 16 июня 2010

Мой ответ приходит от здесь

Вы можете создать производный класс, который установит свойство timeout базового WebRequest класса:

using System;
using System.Net;

public class WebDownload : WebClient
{
    /// <summary>
    /// Time in milliseconds
    /// </summary>
    public int Timeout { get; set; }

    public WebDownload() : this(60000) { }

    public WebDownload(int timeout)
    {
        this.Timeout = timeout;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request != null)
        {
            request.Timeout = this.Timeout;
        }
        return request;
    }
}

и вы можете использовать его как базовый класс WebClient.

40 голосов
/ 02 марта 2009

Попробуйте WebClient.DownloadFileAsync(). Вы можете позвонить CancelAsync() по таймеру с вашим собственным временем ожидания.

3 голосов
/ 25 января 2014

Предполагая, что вы хотите сделать это синхронно, используя метод WebClient.OpenRead (...) и устанавливая время ожидания в возвращаемом потоке, вы получите желаемый результат:

using (var webClient = new WebClient())
using (var stream = webClient.OpenRead(streamingUri))
{
     if (stream != null)
     {
          stream.ReadTimeout = Timeout.Infinite;
          using (var reader = new StreamReader(stream, Encoding.UTF8, false))
          {
               string line;
               while ((line = reader.ReadLine()) != null)
               {
                    if (line != String.Empty)
                    {
                        Console.WriteLine("Count {0}", count++);
                    }
                    Console.WriteLine(line);
               }
          }
     }
}

Извлечение из WebClient и переопределение GetWebRequest (...) для установки времени ожидания, предложенного @Beniamin, у меня не сработало, но это сработало.

...