2011-11-02 1 views
0

Je dois créer plusieurs requêtes Web sur la même URL à l'aide du client Web. Je génère le thread à l'aide du pool de threads QueueUserWorkItem. Le code ci-dessous montre comment je génère du fil et publie en utilisant WebClient. J'ai dû dériver la classe client Web pour définir la propriété Expect100Continue et Timeout.Mise à l'échelle du client Web à l'aide du pool de threads

Lorsque j'exécute ce code sans Thread.Sleep (ligne commentée dans le code thread spawn), j'obtiens un temps de réponse supérieur à 1500 millisecondes. Veuillez vérifier la logique pour calculer le temps de réponse dans la méthode PostToURL. Mais si je mets 1 seconde de sommeil avant de générer un autre thread, j'obtiens un temps de réponse inférieur à 300 millisecondes. Je ne pouvais pas trouver de raison pourquoi est-ce si différent. En fait, je dois apporter ce temps de réponse à 300 millisecondes. C'est le code du harnais de test que j'écris pour tester un service. Pouvez-vous indiquer pourquoi le temps de réponse est différent?

Voici le code qui engendre le fil

foreach (var nameValueCollection in requestCollections) 
{ 
    NameValueCollection collection = nameValueCollection; 
    ThreadPool.QueueUserWorkItem(a => { if (collection != null) PostToURL  
    (collection); }); 
    //Thread.Sleep(TimeSpan.FromSeconds(1)); 
} 

Voici la méthode ce poste à une URL

public void PostToURL(NameValueCollection collection) 
    { 
     DateTime requestStartDate = DateTime.Now; 
     DateTime requestEndDate = DateTime.Now; 
     string encodedResponse; 
     try 
     { 
      using (var transportType2 = new DerivedWebClient()) 
      { 
       transportType2.Expect100Continue = false; 
       transportType2.Timeout = TimeSpan.FromMilliseconds(2000); 

       ServicePointManager.ServerCertificateValidationCallback = 
        new RemoteCertificateValidationCallback(delegate { return true; }); 

       requestStartDate = DateTime.Now; 
       var responseArray = transportType2.UploadValues("http://xyz/Post.ashx?AccountName=myaccount", 
                   "POST", collection); 
       requestEndDate = DateTime.Now; 
       Console.WriteLine(requestEndDate.Subtract(requestStartDate).TotalMilliseconds); 

       encodedResponse = Encoding.ASCII.GetString(responseArray); 

       transportType2.Dispose(); 
      } 
     } 
     catch (Exception exception) 
     { 
      requestEndDate = DateTime.Now; 
      encodedResponse = exception.ToString(); 
     } 

     //Global variable to record request and response 
     responses.Add(new ServiceResponse 
     { 
      ResponseInMs = (int) requestEndDate.Subtract(requestStartDate).TotalMilliseconds, 
      StartTime = requestStartDate, 
      EndTime = requestEndDate, 
      Response = encodedResponse, 
      Request = string.Join(";", collection.Cast<string>() 
         .Select(col => String.Concat(col, "=", collection[col])).ToArray()), 
      ApplicationId = collection["ApplicationId"] 

     }); 
    } 

MISE À JOUR Voici le code qui dérivent webclient

public class DerivedWebClient: WebClient 
{ 
    public bool Expect100Continue 
    { 
     get; 
     set; 
    } 

    public TimeSpan Timeout 
    { 
     get; 
     set; 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     if (request != null) 
     { 
      request.ServicePoint.Expect100Continue = Expect100Continue; 
      request.KeepAlive = false; 
      request.Timeout = (int) Timeout.TotalMilliseconds; 
     } 

     return request; 
    } 
} 
+0

Quelqu'un peut-il modifier le code pour qu'il apparaisse comme un bloc de code? Je ne pouvais pas. – Amzath

Répondre

0

Cette question peut être en double à UploadValuesAsync response time. Mais les blocs de code sont différents Je considérerais différentes questions mais le problème est le même. Réponse à l'autre question aussi, s'applique ici.

0

Client HTTP .NET, par défaut, est limité à un certain nombre de connexions simultanées. Je suppose que vous avez atteint cette limite, donc chaque thread attend une connexion gratuite avant de faire une nouvelle demande.

La limite par défaut varie selon que vous exécutez une application cliente, dans ASP.net, etc., mais vous pouvez la modifier. Utilisez ServicePointManager.DefaultConnectionLimit pour augmenter cette limite globalement.

Questions connexes