Comment implémenter un timeout sur WebClient.DownloadFileAsync

J’ai donc pensé que Webclient.DownloadFileAysnc aurait un délai d’expiration par défaut, mais en Webclient.DownloadFileAysnc la documentation, je ne trouve rien à ce sujet, je suppose que ce n’est pas le cas.

J’essaie de télécharger un fichier à partir d’Internet comme suit:

  using (WebClient wc = new WebClient()) { wc.DownloadProgressChanged += ((sender, args) => { IndividualProgress = args.ProgressPercentage; }); wc.DownloadFileCompleted += ((sender, args) => { if (args.Error == null) { if (!args.Cancelled) { File.Move(filePath, Path.ChangeExtension(filePath, ".jpg")); } mr.Set(); } else { ex = args.Error; mr.Set(); } }); wc.DownloadFileAsync(new Uri("MyInternetFile", filePath); mr.WaitOne(); if (ex != null) { throw ex; } } 

Mais si j’éteins mon WiFi (simulant une goutte de connexion Internet), mon application se met juste en pause et le téléchargement s’arrête, mais la méthode DownloadFileCompleted ne le signalera jamais.

Pour cette raison, j’aimerais implémenter un délai d’attente sur ma méthode WebClient.DownloadFileAsync . Est-ce possible?

En passant, j’utilise .Net 4 et ne souhaite pas append de références à des bibliothèques tierces. Je ne peux donc pas utiliser les mots-clés Async/Await

Vous pouvez utiliser WebClient.DownloadFileAsync (). Maintenant, dans une timer, vous pouvez appeler CancelAsync () comme suit:

 System.Timers.Timer aTimer = new System.Timers.Timer(); System.Timers.ElapsedEventHandler handler = null; handler = ((sender, args) => { aTimer.Elapsed -= handler; wc.CancelAsync(); }); aTimer.Elapsed += handler; aTimer.Interval = 100000; aTimer.Enabled = true; 

Sinon créez votre propre weclient

  public class NewWebClient : WebClient { protected override WebRequest GetWebRequest(Uri address) { var req = base.GetWebRequest(address); req.Timeout = 18000; return req; } } 

Créez une classe WebClientAsync qui implémente le temporisateur dans le constructeur. De cette façon, vous ne copiez et collez pas le code du minuteur dans chaque implémentation.

 public class WebClientAsync : WebClient { private int _timeoutMilliseconds; public EdmapWebClientAsync(int timeoutSeconds) { _timeoutMilliseconds = timeoutSeconds * 1000; Timer timer = new Timer(_timeoutMilliseconds); ElapsedEventHandler handler = null; handler = ((sender, args) => { timer.Elapsed -= handler; this.CancelAsync(); }); timer.Elapsed += handler; timer.Enabled = true; } protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); request.Timeout = _timeoutMilliseconds; ((HttpWebRequest)request).ReadWriteTimeout = _timeoutMilliseconds; return request; } protected override voidOnDownloadProgressChanged(DownloadProgressChangedEventArgs e) { base.OnDownloadProgressChanged(e); timer.Reset(); //If this does not work try below timer.Start(); } } 

Cela vous permettra d’expirer si vous perdez votre connexion Internet lors du téléchargement d’un fichier.