2009-03-02 3 views

Antwort

39

Versuchen Sie WebClient.DownloadFileAsync(). Sie können CancelAsync() per Timer mit Ihrem eigenen Timeout aufrufen.

+2

Ich möchte nicht Timer oder Stoppuhr verwenden. Ich möchte einen integrierten Hack- oder API-Ansatz. Die Verwendung von Timer/Stoppuhr kostet mich zusätzlichen Thread zum Ansehen, während diese Funktion vielleicht schon implementiert ist, also warum das Rad neu erfinden –

+0

@Kilanny: dann geh mit der Lösung aus einer anderen Antwort. Oder verwenden Sie HttpClient und legen Sie die Timeout-Eigenschaft fest. Bitte beachten Sie auch, dass diese Antwort von 2009 ist. – abatishchev

+5

in .Net 4.5+ können Sie auch 'var taskDownload = client.DownloadFileTaskAsync (neue Uri (" http: // localhost/folder ")," Dateiname ")' 'und dann' taskDownload verwenden .Wait (TimeSpan.FromSeconds (5)); ' – itsho

239

Meine Antwort kommt von here

Sie eine abgeleitete Klasse machen, die die Timeout-Eigenschaft der Basis WebRequest Klasse festgelegt wird:

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

und man kann es ebenso wie die Basis WebClient-Klasse verwenden .

+68

Liebe, wenn Leute mit Code antworten ... – kape123

+2

Nur wenn jemand anderes auf diesen hilfreichen Code stößt, musste ich das Timeout vor dem Aufruf von base.GetWebRequest (Adresse) setzen – Darthtong

+0

Resharper beschwert sich über ein möglicher Nullwert für "result" und schlägt eine Nullprüfung vor dem Festlegen des Timeout-Werts für die WebRequest vor. Wenn man sich den dekompilierten Code anschaut, scheint es unmöglich, es sei denn, Sie haben in Ihrer web.config ein benutzerdefiniertes WebRequestModules bereitgestellt, aber für eine solche upovierte Antwort würde ich sie nur für den Fall hinzufügen. –

3

Angenommen, Sie dies synchron tun wollte, die WebClient.OpenRead mit (...) Methode und auf dem Strom der Timeout-Einstellung, dass es wieder geben Sie das gewünschte Ergebnis:

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

von WebClient Ableitung und überschreiben GetWebRequest (...), um das Zeitlimit zu setzen @Beniamin vorgeschlagen, funktionierte nicht für mich als, aber das tat.

+0

@jeffymorris hat nicht für mich gearbeitet. Ich bekomme immer noch WebException sagen "die Anfrage wurde abgebrochen - die Operation hat abgelaufen", auch wenn ich "stream.ReadTimeout" größer als es tatsächlich dauerte, um die Anfrage – chester89

+0

@jeffymoris auf der anderen, die Lösung mit Webclient Unterklasse nicht ausgeführt hat funktionieren entweder, also ist es wahrscheinlich ein Problem auf der Serverseite – chester89