web-dev-qa-db-fra.com

Définir le délai d'attente pour webClient.DownloadFile ()

J'utilise webClient.DownloadFile() pour télécharger un fichier. Puis-je définir un délai d'expiration pour que cela ne prenne pas autant de temps s'il ne peut pas accéder au fichier?

90
UnkwnTech

Essayez WebClient.DownloadFileAsync(). Vous pouvez appeler CancelAsync() par minuterie avec votre propre délai.

41
abatishchev

Ma réponse vient de ici

Vous pouvez créer une classe dérivée, qui définira la propriété timeout de la classe WebRequest de base:

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

et vous pouvez l'utiliser comme la classe WebClient de base.

253
Beniamin

En supposant que vous souhaitiez le faire de manière synchrone, utilisez la méthode WebClient.OpenRead (...) et définissez le délai d'expiration du flux renvoyé pour vous donner le résultat souhaité:

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

Dériver de WebClient et remplacer GetWebRequest (...) pour définir le délai d'expiration suggéré par @Beniamin n'a pas fonctionné pour moi, mais cela a fonctionné.

3
jeffrymorris