J'essaie d'utiliser Func avec la méthode asynchrone. Et je reçois une erreur.
Impossible de convertir une expression lambda asynchrone en type délégué
'Func<HttpResponseMesage>'
. Une expression lambda asynchrone peut retourner void, Task ouTask<T>
, dont aucun n'est convertible en'Func<HttpResponseMesage>'
.
ci-dessous est mon code:
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();
}
Comme le dit l'erreur, les méthodes asynchrones renvoient Task
, Task<T>
ou void
. Donc, pour que cela fonctionne, vous pouvez:
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
Le chemin que je prends habituellement consiste à demander à la méthode Main
d'appeler une méthode Run()
qui renvoie une tâche, et à .Wait()
sur le Task
à terminer.
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();
}
}
Cela permet au reste de votre application console de s'exécuter avec une prise en charge asynchrone/en attente complète. Puisqu'il n'y a pas de thread d'interface utilisateur dans une application de console, vous ne courez pas le risque d'interblocage avec l'utilisation de .Wait()
.
Correction de code telle que:
static void Main(string[] args)
{
Program p = new Program();
Task<HttpResponseMessage> myTask = p.CallAsyncMethod();
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
Console.ReadLine();
}