2014-07-23 5 views
1

J'essaie de limiter le nombre de connexions max que j'ai à un point de terminaison et je le fais en définissant ServicePointManager.DefaultConnectionLimit mais cela ne fonctionne pas. Pour tester cela, j'ai mis en place un point de terminaison qui dort pendant 5 secondes, puis revient.Comment limiter les connexions avec Async HttpClient C#

Voici mon code:

class Program 
{ 
    private static Uri uri = new Uri("http://myservice.com?sleepForMillisecond=5000")); 

    static void Main(string[] args) 
    { 
     ServicePointManager.DefaultConnectionLimit = 1; 
     MainAsync().Wait(); 
    } 

    static async Task MainAsync() 
    { 
     var watch = Stopwatch.StartNew(); 
     var tasks = new List<Task>() 
      { 
       Task.Run(async() => await MakeCallWithHttpClient()), 
       Task.Run(async() => await MakeCallWithHttpClient()), 
       Task.Run(async() => await MakeCallWithHttpClient()) 
      }; 

     await Task.WhenAll(tasks); 
     watch.Stop(); 
     Console.WriteLine("Elapsed Time For HttpClient: " + watch.Elapsed); 

     watch.Restart(); 
     tasks = new List<Task>() 
      { 
       Task.Run(async() => await MakeCallWithWebClient()), 
       Task.Run(async() => await MakeCallWithWebClient()), 
       Task.Run(async() => await MakeCallWithWebClient()) 
      }; 

     await Task.WhenAll(tasks); 
     watch.Stop(); 
     Console.WriteLine("Elapsed Time For WebClient: " + watch.Elapsed); 
     Console.WriteLine("Press Enter To Exit."); 
     Console.ReadLine(); 
    } 

    private static async Task MakeCallWithHttpClient() 
    { 
     var client = new HttpClient(); 
     await client.GetStringAsync(uri); 
     Console.WriteLine("Done"); 
    } 

    private static async Task MakeCallWithWebClient() 
    { 
     var client = new WebClient(); 
     await client.DownloadStringTaskAsync(uri); 
     Console.WriteLine("Done"); 
    } 
} 

Voici la sortie:

Done 
Done 
Done 
Elapsed Time For HttpClient: 00:00:05.0953943 
Done 
Done 
Done 
Elapsed Time For WebClient: 00:00:15.0450096 

Comme vous pouvez le voir le async HttpClient est pas limité par les connexions max de 1 depuis qu'il a fait 3 appels en parallèle prend 5 secondes et le WebClient asynchrone est limité par la connexion 1 car effectuer 3 appels en parallèle prend 15 secondes.

Ma question est ... Comment limiter les connexions max en utilisant le client HTTP asynchrone?

Merci.

+0

Pour devenir éclairé avoir une lecture de cet intéressant poste SO ... http://stackoverflow.com/questions/16194054/is-async-httpclient-from-net-4-5-a-bad-choice-for -intensif-charger-applications async ou multithread? –

Répondre

0

Utilisez la même instance HttpClient pour toutes les demandes et la limite de connexion fonctionnera comme prévu.

+0

J'utilise la même instance de httpclient mais je ne vois pas l'effet. Des indices? –

+0

@ TomaszJaskuλa Lorsque vous effectuez plusieurs demandes, combien de connexions sont ouvertes? Quelle est la valeur de DefaultConnectionLimit? –

+0

Je faisais pour les tests 1000 appels asynchrones sur la même instance HttpClient. La définition de DefaultConnectionLimit à 5 (ou 100) n'a rien changé. J'avais quelque chose comme 300 connexions TCP ouvertes. Cependant cela a fonctionné pour moi nouveau HttpClient (nouveau HttpClientHandler { MaxConnectionsPerServer = 5 }). Cela a fonctionné et j'avais seulement 5 connexions ouvertes pour 1000 appels. –

Questions connexes