J'utilise webClient.DownloadFile()
pour télécharger un fichier puis-je définir un délai pour cela afin que cela ne prenne pas si longtemps s'il ne peut pas accéder au fichier?
Réponses:
Essayez WebClient.DownloadFileAsync()
. Vous pouvez appeler CancelAsync()
par minuterie avec votre propre délai.
var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")
et puistaskDownload.Wait(TimeSpan.FromSeconds(5));
Ma réponse vient d' ici
Vous pouvez créer une classe dérivée, qui définira la propriété timeout de la WebRequest
classe 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.
request.Timeout
. Message d'erreur 'System.Net.WebRequest' does not contain a definition for 'Timeout' and no extension method 'Timeout' accepting a first argument of type 'System.Net.WebRequest' could be found (are you missing a using directive or an assembly reference?)
, que me manque-t-il?
using
directives qui sont utilisées par cet extrait de code.
En supposant que vous vouliez le faire de manière synchrone, utiliser la méthode WebClient.OpenRead (...) et définir le délai d'expiration sur le Stream qu'il renvoie 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é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é.
stream.ReadTimeout
plus grand que ce qu'il a réellement fallu pour exécuter la demande