2016-01-29 6 views
7

Mam httpclient takiego:Dlaczego wywołanie funkcji HttpClient.PostAsync jest bardzo powolne w mojej aplikacji C# winforms?

var client = new HttpClient(); 

mogę napisać do niego tak:

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

i uzyskać odpowiedź tak:

HttpResponseMessage response = result.Result; 

rozumiem to wywołanie będzie blokować wątek, tak to powinno działać (po prostu zbudowanie dla siebie narzędzia, brak potrzebnych wątków asynchronicznych)

Po pierwszym uruchomieniu tej rozmowy uzyskanie wyniku zajmuje około 2 minut. Tymczasem, jeśli wykonam dokładnie to samo połączenie w innym miejscu, zrobię to w ciągu 200ms. Nawet jeśli trafię w google, zajmuje to 2 minuty. Ale po pierwszym telefonie, dopóki utrzymuję aplikację otwartą, wszystkie dodatkowe połączenia są dobre. Jest to po prostu pierwszy cal po otwarciu aplikacji. Co może być przyczyną tego?

+1

chciałbym zacząć za pomocą '.ContinueWith' zamiast' .Result' (obsługi 'asynchroniczny/await' ...) - oprócz tego, że nic nie widzę Mogłem spowodować takie opóźnienie i szczerze mówiąc podejrzewam, że problem leży gdzieś indziej. – Carsten

+0

Byłoby to łatwe, gdybyśmy mieli stos do obejrzenia. Użyj nowego WebClient(). DownloadString() dla celów testowych, wstrzymaj debuger podczas pauzy i opublikuj stos wywołań zawierający kod zewnętrzny. Prawdopodobnie mówi coś o DNS lub proxy. – usr

+1

Nie mogę zacząć zgadywać, ale zacznę od wykluczenia możliwości synchronicznego wykonywania tego problemu. HttpClient został zaprojektowany tak, aby był tylko asynchroniczny i istnieją silne ostrzeżenia o używaniu go w sposób blokujący. 'czekaj na wynik' jest tak samo proste jak' result.Result', więc po co mu się oprzeć używając poprawnie? –

Odpowiedz

11

Problem polegał na tym, że wisiał przez bardzo długi czas, próbując rozwiązać serwer proxy dla klienta. Inicjowanie HttpClient tak wystarczyły:

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

Thx dużo za odpowiedź. Miałem ten sam problem z prośbami o pobieranie. –

+0

Mam podobne problemy, prośba, która zajmuje 40 ms przy drugiej próbie i mierzona przez skrzypka zajmuje 1-2.5 sekundy (co biorąc pod uwagę długość żądania jest bardzo duża) po raz pierwszy, nawet z nowym wystąpieniem HttpClient. Ustawienie UseProxy = false nie pomogło. –

Powiązane problemy