2009-03-02 11 views

Répondre

39

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

+2

Je ne veux pas utiliser la minuterie ou le chronomètre. Je veux une approche hack ou api intégrée. L'utilisation de la minuterie/chronomètre me coûte un fil supplémentaire pour regarder, alors que cette fonctionnalité peut-être déjà mis en œuvre, alors pourquoi réinventer la roue –

+0

@Kilanny: puis aller avec la solution d'une autre réponse. Ou utilisez HttpClient et définissez la propriété Timeout. Notez également que cette réponse date de 2009. – abatishchev

+5

dans .Net 4.5+, vous pouvez également utiliser 'var taskDownload = client.DownloadFileTaskAsync (nouveau Uri (" http: // localhost/dossier ")," puis "taskDownload .Wait (TimeSpan.FromSeconds (5)); ' – itsho

239

Ma réponse vient de here

Vous pouvez faire une classe dérivée, qui définira la propriété de délai d'attente de la base WebRequest classe:

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 de base WebClient .

+68

amour quand les gens répondent avec le code ... – kape123

+2

Juste incase quelqu'un d'autre vient à travers ce code utile que je devais définir le délai avant d'appeler base.GetWebRequest (adresse) – Darthtong

+0

Resharper se plaint de une valeur nulle possible pour "result" et suggère une vérification null avant de définir la valeur Timeout à WebRequest. En regardant le code décompilé, il semble impossible à moins que vous fournissiez un WebRequestModules personnalisé dans votre web.config, mais pour une telle réponse mise à jour, je l'ajouterais juste au cas où. –

3

En supposant que vous vouliez faire de manière synchrone, en utilisant la WebClient.OpenRead (...) la méthode et le réglage du délai d'attente sur le flux qu'il retourne vous donnera 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érivant de WebClient et en remplaçant GetWebRequest (...) pour définir le délai d'attente @Beniamin suggéré, n'a pas fonctionné pour moi comme, mais cela a fonctionné.

+0

@jeffymorris n'a pas fonctionné pour moi. Je reçois toujours WebException disant "la demande a été abandonnée - l'opération a expiré" même si je spécifie 'stream.ReadTimeout' plus grand que nécessaire pour exécuter la requête – chester89

+0

@jeffymoris de l'autre, la solution avec sous-classe webclient n'a pas travailler soit, donc c'est probablement un problème du côté du serveur – chester89

Questions connexes