Ich verwende webClient.DownloadFile()
, um eine Datei herunterladen kann ich ein Timeout für diese festlegen, so dass es nicht so lange dauern wird, wenn es nicht auf die Datei zugreifen kann?Zeitüberschreitung für webClient.DownloadFile()
Antwort
Versuchen Sie WebClient.DownloadFileAsync()
. Sie können CancelAsync()
per Timer mit Ihrem eigenen Timeout aufrufen.
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 .
Liebe, wenn Leute mit Code antworten ... – kape123
Nur wenn jemand anderes auf diesen hilfreichen Code stößt, musste ich das Timeout vor dem Aufruf von base.GetWebRequest (Adresse) setzen – Darthtong
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. –
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.
@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
@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
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 –
@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
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