tareas paralelas metodos metodo explained ejecutar await async asincronos asincrono c# asynchronous lambda

c# - paralelas - Usando el delegado funcional con el método asíncrono



metodo task c# (3)

Estoy tratando de usar Func con el método asíncrono. Y estoy recibiendo un error.

No se puede convertir la expresión lambda asíncrona al tipo delegado ''Func<HttpResponseMesage>'' . Una expresión lambda asíncrona puede devolver void, Task o Task<T> , ninguno de los cuales se puede convertir a ''Func<HttpResponseMesage>'' .

abajo está mi código:

public async Task<HttpResponseMessage> CallAsyncMethod() { Console.WriteLine("Calling Youtube"); HttpClient client = new HttpClient(); var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM"); Console.WriteLine("Got Response from youtube"); return response; } static void Main(string[] args) { Program p = new Program(); Task<HttpResponseMessage> myTask = p.CallAsyncMethod(); Func<HttpResponseMessage> myFun =async () => await myTask; Console.ReadLine(); }


Como dice el error, los métodos asíncronos devuelven Task , Task<T> o void . Así que para que esto funcione, puedes:

Func<Task<HttpResponseMessage>> myFun = async () => await myTask;


Corrección de código como:

static void Main(string[] args) { Program p = new Program(); Task<HttpResponseMessage> myTask = p.CallAsyncMethod(); Func<Task<HttpResponseMessage>> myFun = async () => await myTask; Console.ReadLine(); }


La ruta que normalmente tomo es hacer que el método Main invoque un método Run() que devuelva una tarea, y .Wait() en la Task para completar.

class Program { public static async Task<HttpResponseMessage> CallAsyncMethod() { Console.WriteLine("Calling Youtube"); HttpClient client = new HttpClient(); var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM"); Console.WriteLine("Got Response from youtube"); return response; } private static async Task Run() { HttpResponseMessage response = await CallAsyncMethod(); Console.ReadLine(); } static void Main(string[] args) { Run().Wait(); } }

Esto permite que el resto de la aplicación de la consola se ejecute con soporte completo async / await. Como no hay ningún subproceso de UI en una aplicación de consola, no corre el riesgo de interbloqueo con el uso de .Wait() .