设置webClient.DownloadFile()的超时

时间:2009-03-02 10:16:58

标签: c# .net download webclient

我正在使用webClient.DownloadFile()下载文件我可以为此设置超时,这样如果它无法访问该文件就不会花这么长时间吗?

3 个答案:

答案 0 :(得分:251)

我的回答来自here

你可以创建一个派生类,它将设置基类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类一样使用它。

答案 1 :(得分:40)

试试WebClient.DownloadFileAsync()。您可以通过计时器使用自己的超时时间调用CancelAsync()

答案 2 :(得分:3)

假设您想要同步执行此操作,使用WebClient.OpenRead(...)方法并在它返回的Stream上设置超时将为您提供所需的结果:

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,对我来说不起作用,但是这样做了。