c# - getstringasync - El depurador se detiene después de una llamada asíncrona a HttpClient.GetAsync() en Visual Studio
postasync httpclient c# (1)
Cuando Main
sale, el programa sale. Cualquier operación asíncrona pendiente se cancela y sus resultados se descartan.
Por lo tanto, debe bloquear Main
salida de Main
, ya sea bloqueando la operación asíncrona o algún otro método (por ejemplo, llamando a Console.ReadKey
para bloquear hasta que el usuario presione una tecla):
static void Main(string[] args)
{
Program program = new Program();
var content = program.Get(@"http://www.google.com").Wait();
Console.WriteLine("Program finished");
}
Un enfoque común es definir un MainAsync
que haga el manejo de excepciones también:
static void Main(string[] args)
{
MainAsync().Wait();
}
static async Task MainAsync()
{
try
{
Program program = new Program();
var content = await program.Get(@"http://www.google.com");
Console.WriteLine("Program finished");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
Tenga en cuenta que el bloqueo en código asíncrono generalmente se considera una mala idea; Hay muy pocos casos donde se debe hacer, y el método Main
una aplicación de consola resulta ser uno de ellos.
Estoy tratando de probar el siguiente método de solicitud http
public async Task<HttpContent> Get(string url)
{
using (HttpClient client = new HttpClient())
// breakpoint
using (HttpResponseMessage response = await client.GetAsync(url))
// can''t reach anything below this point
using (HttpContent content = response.Content)
{
return content;
}
}
Sin embargo, el depurador parece estar saltando el código debajo del segundo comentario. Estoy usando Visual studio 2015 RC, ¿alguna idea? También traté de comprobar la ventana de tareas y no vi nada
Edit: Encontré la solución
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace ConsoleTests
{
class Program
{
static void Main(string[] args)
{
Program program = new Program();
var content = program.Get(@"http://www.google.com");
Console.WriteLine("Program finished");
}
public async Task<HttpContent> Get(string url)
{
using (HttpClient client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false))
using (HttpContent content = response.Content)
{
return content;
}
}
}
}
Resulta que debido a que se trataba de una aplicación de consola C #, terminó después del final del hilo principal, supongo, porque después de agregar una Console.ReadLine () y esperar un poco, la solicitud volvió. Supuse que C # esperaría hasta que mi tarea se ejecutara y no terminara antes, pero supongo que estaba equivocado. Si alguien pudiera explicar por qué sucedió esto, sería bueno.