postasync getstringasync getasync ejemplos c# asynchronous async-await visual-studio-2015

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.