web-dev-qa-db-fra.com

Utilisation du délégué Func avec la méthode Async

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 ou Task<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();
}
42
maxspan

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;
64
spender

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

4

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();
        }
3
Linh Tuan