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;
}
}
Quelqu'un peut-il modifier le code pour qu'il apparaisse comme un bloc de code? Je ne pouvais pas. – Amzath