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 oTask<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()
.