如何在.net上为WebClient设置TimeOut?
我下载了一些文件,但我也想为webclient设置超时。 正如我所看到的那样,我们可以使用重写WebRequest。 我已经做了但它没有用。 我的意思是重写GetWebRequest方法不起作用..这是我的代码
public class VideoDownloader : Downloader { /// /// Initializes a new instance of the class. /// /// The video to download. /// The path to save the video. public VideoDownloader(VideoInfo video, string savePath) : base(video, savePath) { } /// /// Starts the video download. /// public override void Execute() { // We need a handle to keep the method synchronously var handle = new ManualResetEvent(false); var client = new WebClient(); client.DownloadFileCompleted += (sender, args) => handle.Set(); client.DownloadProgressChanged += (sender, args) => this.OnProgressChanged(new ProgressEventArgs(args.ProgressPercentage)); this.OnDownloadStarted(EventArgs.Empty); client.DownloadFileAsync(new Uri(this.Video.DownloadUrl), this.SavePath); handle.WaitOne(); handle.Close(); this.OnDownloadFinished(EventArgs.Empty); } protected override WebRequest GetWebRequest(Uri address) { WebRequest w = base.GetWebRequest(address); w.Timeout = 10*1000; // 20 * 60 * 1000; return w; } }
和下载课程
public abstract class Downloader: WebClient { /// /// Initializes a new instance of the class. /// /// The video to download/convert. /// The path to save the video/audio. protected Downloader(VideoInfo video, string savePath) { this.Video = video; this.SavePath = savePath; } protected override WebRequest GetWebRequest(Uri address) { WebRequest w = base.GetWebRequest(address); w.Timeout = 10 * 1000; // 20 * 60 * 1000; return w; } /// /// Occurs when the download finished. /// public event EventHandler DownloadFinished; /// /// Occurs when the download is starts. /// public event EventHandler DownloadStarted; /// /// Occurs when the progress has changed. /// public event EventHandler ProgressChanged; /// /// Gets the path to save the video/audio. /// public string SavePath { get; private set; } /// /// Gets the video to download/convert. /// public VideoInfo Video { get; private set; } /// /// Starts the work of the . /// public abstract void Execute(); protected void OnDownloadFinished(EventArgs e) { if (this.DownloadFinished != null) { this.DownloadFinished(this, e); } } protected void OnDownloadStarted(EventArgs e) { if (this.DownloadStarted != null) { this.DownloadStarted(this, e); } } protected void OnProgressChanged(ProgressEventArgs e) { if (this.ProgressChanged != null) { this.ProgressChanged(this, e); } } }
我的错误在哪里? 注意:我想下载异步
来自MSDN Doc:
Timeout属性仅影响使用GetResponse方法进行的同步请求。 要使异步请求超时,请使用Abort方法。
因此,如果您要执行异步请求,我认为您需要管理自己的计时器,并在任何时间段后在实例上调用.Abort()。
在此MSDN页面上有一些示例代码显示.Abort()
方法。