2014-10-06 17 views
7

Quando provo il seguente codice:comportamento Timeout in HttpWebRequest.GetResponse() vs GetResponseAsync()

var request = (HttpWebRequest)HttpWebRequest.Create(url); 
request.Timeout = 3; // a small value 

var response = request.GetResponse(); 
Console.WriteLine(response.ContentLength); 

per un URL che so che sta andando a prendere più di 3 millisecondi per caricare (ho messo un Thread.Sleep(110000) in Application_BeginRequest) funziona correttamente e genera un WebException come previsto.

problema è quando posso passare al metodo asincrono:

var response = request.GetResponseAsync().Result; 

o

var response = await request.GetResponseAsync(); 

Questa versione asincrona ignora completamente qualsiasi valore di timeout, tra cui ReadWriteTimeout e ServicePoint.MaxIdleTime

non riuscivo a trovare nulla su Timeout in MSDN GetResponseAsync() ora mi chiedo se si tratta di un bug in GetResponseAsync() o qualcosa non va nel modo in cui uso async qui?

+0

vedere la risposta in http://stackoverflow.com/questions/4238345/asynchronously-wait-for-taskt-to-completo-withtimetime – artm

+0

Significa che ignorano intenzionalmente Timeout in tutte le API asincrone? Lo trovo difficile da credere. Ad esempio, in questo caso specifico, l'utente API non può in alcun modo impostare valori di timeout diversi per fasi diverse come ReadWriteTimeout/ContinueTimeout –

risposta

14

Timeout non si applica alle richieste asincrone HttpWebRequest. Per citare the docs:

proprietà L'Timeout non ha alcun effetto sulle richieste asincrone

vi consiglio di utilizzare HttpClient invece, che è stato progettato con richieste asincrone in mente.

+0

Ah! Stavo controllando i documenti sbagliati. Grazie –

+2

"La proprietà Timeout non ha effetto sulle richieste asincrone ** eseguite con il metodo BeginGetResponse o BeginGetRequestStream. **": i documenti non riguardano GetResponseAsync, ma la risposta è corretta comunque, poiché GetResponseAsync utilizza BeginGetResponse all'interno. – VorobeY1326

Problemi correlati