¿Cómo configurar TimeOut para WebClient en .net?

Descargo algún archivo pero también quiero establecer el tiempo de espera para el cliente web. Como veo, no hay ningún cambio, solo podemos usar la solicitud de información de anulación. Ya lo hice pero no funciona. Me refiero a que la anulación del método GetWebRequest no funciona ... Aquí están mis códigos

  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;

    }

}

Y la clase de descarga

 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);
        }
    }
}

¿Dónde está mi error? Nota: Quiero descargar asincronía.

Respuestas a la pregunta(1)

Su respuesta a la pregunta