c# - operación - httpwebrequest timeout
Llamada asincrónica con espera en HttpClient nunca regresa (1)
Tengo una llamada que estoy haciendo desde dentro de una aplicación de metro C#
basada en xaml en el CP Win8; esta llamada simplemente golpea un servicio web y devuelve datos JSON.
HttpMessageHandler handler = new HttpClientHandler();
HttpClient httpClient = new HttpClient(handler);
httpClient.BaseAddress = new Uri("http://192.168.1.101/api/");
var result = await httpClient.GetStreamAsync("weeklyplan");
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeeklyPlanData[]));
return (WeeklyPlanData[])ser.ReadObject(result);
Se cuelga a la await
pero la llamada http en realidad regresa casi de inmediato (confirmado a través del violín); es como si la await
se ignora y simplemente se cuelga allí.
Antes de preguntar , SÍ, la capacidad de red privada está activada.
¿Alguna idea de por qué esto se bloquea?
Mira esta respuesta a mi pregunta, que parece ser muy similar.
Algo que intentar: llamar a ConfigureAwait(false)
en la tarea devuelta por GetStreamAsync()
. P.ej
var result = await httpClient.GetStreamAsync("weeklyplan")
.ConfigureAwait(continueOnCapturedContext:false);
Que esto sea o no útil depende de cómo se llame su código anterior, en mi caso llamar al método async
usando Task.GetAwaiter().GetResult()
hizo que el código se cuelgue.
Esto se debe a que GetResult()
bloquea el hilo actual hasta que se complete la tarea. Cuando la tarea se completa, intenta volver a ingresar al contexto del hilo en el que se inició, pero no puede porque ya hay un hilo en ese contexto, que está bloqueado por la llamada a GetResult()
... ¡punto muerto!
Esta publicación de MSDN entra en detalles sobre cómo .NET sincroniza los hilos paralelos, y la respuesta a mi propia pregunta ofrece algunas de las mejores prácticas.