tiempo operación excedió espera c# asynchronous async-await dotnet-httpclient

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.