2009-03-02 21 views

Respuesta

39

Probar WebClient.DownloadFileAsync(). Puede llamar al CancelAsync() por temporizador con su propio tiempo de espera.

+2

No quiero usar el cronómetro ni el cronómetro. Quiero un enfoque incorporado de hack o api. Usar el cronómetro/cronómetro me cuesta un hilo adicional para mirar, mientras que esta característica quizás ya esté implementada, entonces, ¿por qué reinventar la rueda –

+0

@Kilanny: luego ir con la solución de otra respuesta. O use HttpClient y establezca la propiedad Timeout. También tenga en cuenta que esta respuesta es de 2009. – abatishchev

+5

en .Net 4.5+ también puede usar 'var taskDownload = client.DownloadFileTaskAsync (new Uri (" http: // localhost/folder ")," filename ")' y luego 'taskDownload .Wait (TimeSpan.FromSeconds (5)); ' – itsho

239

Mi respuesta viene de here

Se puede hacer una clase derivada, que establecerá la propiedad de tiempo de espera de la clase base WebRequest:

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

y se puede usar al igual que la clase WebClient de base .

+68

Me encanta cuando las personas responden con código ... – kape123

+2

Solo en caso de que alguien más encuentre este código útil tuve que configurar el tiempo de espera antes de llamar a base.GetWebRequest (dirección) – Darthtong

+0

Resharper se queja un posible valor nulo para "resultado" y sugiere una verificación nula antes de establecer el valor de Tiempo de espera para WebRequest. Al observar el código descompilado, parece imposible a menos que proporcione un WebRequestModules personalizado en su web.config, pero para una respuesta tan votada, lo agregaría por si acaso. –

3

Suponiendo que quería hacer esto de forma sincrónica, utilizando el método WebClient.OpenRead (...) y establecer el tiempo de espera en la corriente que vuelve le dará el resultado deseado:

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

Derivado de cliente Web y anulando GetWebRequest (...) para establecer el tiempo de espera que @Beniamin sugirió, no funcionó para mí como, pero esto fue así.

+0

@jeffymorris no funcionó para mí. Todavía recibo WebException diciendo "la solicitud fue abortada - la operación ha expirado" incluso si especifico 'stream.ReadTimeout' más grande de lo que realmente tomó para ejecutar la solicitud – chester89

+0

@jeffymoris en el otro, la solución con la subclase webclient no funciona bien, entonces probablemente sea un problema en el lado del servidor – chester89

Cuestiones relacionadas