2010-06-27 11 views
5

Cela se produit uniquement sur l'une de mes machines. Je pense que c'est un problème de configuration de l'environnement. Toutes les machines exécutent le pare-feu du logiciel ESET Smart Security. Des idées?DownloadStringAsync bloque le fil pendant 14 secondes au premier appel

using System; 
using System.Net; 
using System.Diagnostics; 
using System.Threading; 

namespace Test 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      bool exit = false; 
      WebClient wc = new WebClient(); 
      DateTime before = DateTime.Now; 
      wc.DownloadStringAsync(new Uri("http://74.125.95.147"), "First"); // IP Address of google, so DNS requests don't add to time. 
      wc.DownloadStringCompleted += delegate(object sender, DownloadStringCompletedEventArgs e) 
      { 
       Debug.WriteLine(e.UserState + " Call: " + (DateTime.Now - before)); 

       if ((string)e.UserState == "First") 
       { 
        before = DateTime.Now; 
        wc.DownloadStringAsync(new Uri("http://74.125.95.147"), "Second"); 
       } 
       else 
        exit = true; 
      }; 

      /* 
      * 
      * Output: 
      * 
      * First Call: 00:00:13.7647873 
      * Second Call: 00:00:00.0740042 
      * 
      */ 

      while (!exit) 
       Thread.Sleep(1000); 
     } 
    } 
} 
+2

Cela peut être dû à la détection automatique du proxy. Toute modification si vous définissez WebClient.Proxy sur GlobalProxySelection.GetEmptyWebProxy? http://msdn.microsoft.com/en-us/library/system.net.webclient.proxy.aspx http://msdn.microsoft.com/en-us/library/system.net.globalproxyselection.getemptywebproxy.aspx – dtb

+0

Oui, ça l'a corrigé. Merci! Premier appel: 00: 00: 00.1680096 Deuxième appel: 00: 00: 00.0400023 – Mango

+2

@dtb, ajoutez cela comme réponse. Il mérite un vote ou deux. –

Répondre

12

Votre appareil est configuré pour effectuer Détection automatique du proxy.

Vous pouvez le désactiver ici:

Screenshot

Vous pouvez modifier manuellement le proxy utilisé par le WebClient. Définissez le WebClient.Proxy Property sur null pour spécifier qu'aucun proxy ne doit être utilisé. Tout paramètre proxy explicite désactive la détection automatique du proxy.

client.Proxy = null; 

Cependant, vous devez offrir à l'utilisateur la possibilité de configurer un proxy dans votre application dans ce cas, parce que certains utilisateurs sont tenus d'utiliser un proxy pour accéder au Web.

+7

Comme GlobalProxySelection est obsolète, il suffit de définir Proxy sur null Aussi, pour ce faire globalement, WebRequest.DefaultWebProxy = null; – Mango

+4

Y a-t-il un inconvénient à faire cela? Si cela se trouve dans le logiciel client et que le client utilise un proxy, la requête échouera-t-elle? – NickAldwin