2016-01-29 27 views
7

Ho un httpclient come questo:Perché la prima chiamata HttpClient.PostAsync è estremamente lenta nella mia app Winforms C#?

var client = new HttpClient(); 

ho posto a in questo modo:

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

e ottenere la risposta in questo modo:

HttpResponseMessage response = result.Result; 

Capisco questa chiamata bloccherà il thread, ecco come dovrebbe funzionare (basta costruire uno strumento per me stesso, senza bisogno di thread asincroni)

La prima volta che eseguo questa chiamata, sono necessari circa 2 minuti per ottenere un risultato. Nel frattempo, se faccio esattamente la stessa chiamata altrove, è fatta in 200ms. Anche se clicco su Google, ci vogliono 2 minuti. Ma, dopo la prima chiamata, finché tengo l'app aperta, tutte le chiamate aggiuntive sono buone. È solo il primo cal quando apro l'applicazione. Che cosa potrebbe causare questo?

+1

vorrei iniziare utilizzando '.ContinueWith' invece di' .Result' (di utilizzo 'asincrone/await' ...) - a parte questo non vedo nulla che potrebbe causare quel ritardo e, ad essere onesti, sospetto che il problema si trovi altrove – Carsten

+0

Questo sarebbe facile se avessimo uno stack da guardare. Utilizzare il nuovo WebClient(). DownloadString() per scopi di test, mettere in pausa il debugger durante la pausa e inserire lo stack di chiamate incluso il codice esterno. Probabilmente dice qualcosa su DNS o proxy. – usr

+1

Non posso iniziare a indovinare, ma vorrei iniziare escludendo la possibilità che farlo in modo sincrono sia il problema. HttpClient è stato progettato per essere solo asincrono e ci sono forti avvertenze sull'utilizzo in blocco. 'attendere il risultato' è semplice come risultato.Risultare quindi perché resistere all'uso corretto? –

risposta

11

Il problema era che era in sospeso da molto tempo cercando di risolvere un proxy per il client. L'inizializzazione del come questo HttpClient ha fatto il trucco:

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

Thx molto per la risposta. Ho avuto lo stesso problema per ottenere richieste. –

+0

Ho problemi simili, una richiesta che richiede 40 ms al secondo tentativo e misurata dal fiddler richiede 1-2,5 secondi (che considerando la lunghezza della richiesta è molto grande) per la prima volta anche con una nuova istanza di HttpClient. Impostazione UseProxy = false non ha aiutato. –