gpt4 book ai didi

c# - 如何在.net 上为WebClient 设置超时?

转载 作者:太空狗 更新时间:2023-10-29 21:23:38 26 4
gpt4 key购买 nike

我下载了一些文件,但我也想为 webclient 设置超时。正如我所看到的,没有任何变化,只是我们可以使用覆盖 WebRequest。我已经做了,但它不起作用。我的意思是重写 GetWebRequest 方法不起作用。这是我的代码

  public class VideoDownloader : Downloader
{
/// <summary>
/// Initializes a new instance of the <see cref="VideoDownloader"/> class.
/// </summary>
/// <param name="video">The video to download.</param>
/// <param name="savePath">The path to save the video.</param>
public VideoDownloader(VideoInfo video, string savePath)
: base(video, savePath)
{ }


/// <summary>
/// Starts the video download.
/// </summary>
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
{
/// <summary>
/// Initializes a new instance of the <see cref="Downloader"/> class.
/// </summary>
/// <param name="video">The video to download/convert.</param>
/// <param name="savePath">The path to save the video/audio.</param>
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;

}

/// <summary>
/// Occurs when the download finished.
/// </summary>
public event EventHandler DownloadFinished;

/// <summary>
/// Occurs when the download is starts.
/// </summary>
public event EventHandler DownloadStarted;

/// <summary>
/// Occurs when the progress has changed.
/// </summary>
public event EventHandler<ProgressEventArgs> ProgressChanged;

/// <summary>
/// Gets the path to save the video/audio.
/// </summary>
public string SavePath { get; private set; }

/// <summary>
/// Gets the video to download/convert.
/// </summary>
public VideoInfo Video { get; private set; }

/// <summary>
/// Starts the work of the <see cref="Downloader"/>.
/// </summary>
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 文档:

The Timeout property affects only synchronous requests made with the GetResponse method. To time out asynchronous requests, use the Abort method.

因此,如果您要执行异步请求,我认为您需要管理自己的计时器,并在任何时间段后调用实例上的 .Abort()。

this MSDN page 上有一些示例代码显示了这一点对于 .Abort() 方法。

关于c# - 如何在.net 上为WebClient 设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com