2016-01-29 4 views
7

Ich habe ein Httpclient wie folgt aus:Warum ist der erste HttpClient.PostAsync-Aufruf in meiner C# -Winforms-App extrem langsam?

var client = new HttpClient(); 

ich es so schreiben:

var result = client.PostAsync(
       endpointUri, 
       requestContent); 

Und die Antwort wie diese:

HttpResponseMessage response = result.Result; 

ich diesen Anruf verstehen blockiert der Thread, so soll es funktionieren (nur ein Tool für mich selbst, keine asynchronen Threads benötigt)

Wenn ich diesen Anruf zum ersten Mal führe, dauert es etwa 2 Minuten, um ein Ergebnis zu erhalten. Inzwischen, wenn ich den gleichen Anruf an anderer Stelle mache, ist es in 200ms erledigt. Selbst wenn ich Google treffe, dauert es 2 Minuten. Aber nach dem ersten Anruf, solange ich die App offen halte, sind alle weiteren Anrufe gut. Es ist nur das erste Kal, wenn ich die Anwendung öffne. Was könnte das verursachen?

+1

ich mit '.ContinueWith' statt' .Result' (Nutzungs 'async/await' ...) beginnen würde - abgesehen davon Ich sehe nichts, was könnte diese Verzögerung verursachen und um ehrlich zu sein, vermute ich, dass das Problem woanders liegt. – Carsten

+0

Das wäre einfach, wenn wir einen Stack zum Betrachten hätten. Verwenden Sie den neuen WebClient() .DownloadString() zu Testzwecken, pausieren Sie den Debugger während der Pause und buchen Sie den Aufruf-Stack inklusive externem Code. Es sagt wahrscheinlich etwas über DNS oder Proxy aus. – usr

+1

Ich kann nicht anfangen zu erraten, aber ich würde damit anfangen, indem ich die Möglichkeit ausschließe, dass es synchron das Problem ist. HttpClient wurde nur async entworfen und es gibt starke Warnungen über die Blockierung. 'erwarten Sie das Ergebnis' ist genauso einfach wie' result.Result' also warum widerstehen Sie es richtig zu benutzen? –

Antwort

11

Das Problem war, dass es für eine sehr lange Zeit hängen blieb, um einen Proxy für den Client aufzulösen. Initialisieren der Httpclient wie dies der Trick:

var client = new HttpClient(new HttpClientHandler 
      { 
       UseProxy = false 
      }); 
+0

Thx viel für die Antwort. Ich hatte das gleiche Problem für Get-Anfragen. –

+0

Ich habe ähnliche Probleme, eine Anfrage, die 40ms beim zweiten Versuch dauert und von Fiddler gemessen dauert 1-2,5 Sekunden (was die Länge der Anfrage ist sehr groß) zum ersten Mal auch mit einer neuen Instanz von HttpClient. Die Einstellung UseProxy = false hat nicht geholfen. –