Ich habe ein Stück Code, der über eine Sammlung Schleifen und ruft httpclient für jede Iteration. Die API, die der HTTP-Client aufruft, benötigt durchschnittlich 30 bis 40 ms zur Ausführung. Wenn ich es sequentiell anrufe, bekomme ich das erwartete Ergebnis, aber sobald ich Parallel.foreach verwende, dauert es länger. Wenn ich mich genau in den Logs umschaue, kann ich sehen, dass einige httpclient-Aufrufe mehr 1000ms benötigen, um ausgeführt zu werden, und dann fällt die Zeit wieder auf 30-40ms. Wenn ich in den API-Logs sehe, kann ich sehen, dass es kaum über 100ms geht. Ich bin mir nicht sicher, warum ich diesen Spike bekomme.parallel.foreach und httpclient - seltsames Verhalten
Der Code ist
using (var client = new HttpClient())
{
var content = new StringContent(parameters, Encoding.UTF8, "application/json");
var response = client.PostAsync(url, content);
_log.Info(string.Format("Took {0} ms to send post", watch.ElapsedMilliseconds));
watch.Restart();
var responseString = response.Result.Content.ReadAsStringAsync();
_log.Info(string.Format("Took {0} ms to readstring after post", watch.ElapsedMilliseconds));
}
Der Parallelruf ist so etwas wie dieses
Console.WriteLine("starting parallel...");
Parallel.ForEach(recipientCollections, recipientCollection =>
{
// A lot of processing happens here to create relevant content
var secondaryCountryRecipientList = string.Join(",",refinedCountryRecipients);
var emailApiParams = new SendEmailParametersModel(CountrySubscriberApplicationId,
queueItem.SitecoreId, queueItem.Version, queueItem.Language, countryFeedItem.Subject,
countryFeedItem.Html, countryFeedItem.From, _recipientsFormatter.Format(secondaryCountryRecipientList));
log.Info(string.Format("Sending email request for {0}. Recipients {1}", queueItem.SitecoreId, secondaryCountryRecipientList));
var response = _notificationsApi.Invoke(emailApiParams);
});
dank
Senden Sie alle diese Anforderungen an den gleichen Host? – spender
Warum erstellen Sie 'HttpClient' für jeden Anruf? –
Bitte posten Sie den gesamten Code. Da die Parallel-Anweisung fehlt, ist es schwer zu erkennen, wo das Problem liegt. Ich bemerke das Fehlen des Warte-Keywords auf PostAsync. – ManOVision