it-swarm.com.de

Verwenden von Func Delegate mit der Async-Methode

Ich versuche, Func mit der Async-Methode zu verwenden. Und ich erhalte einen Fehler.

Der asynchrone Lambda-Ausdruck kann nicht in den Delegattyp 'Func<HttpResponseMesage>' Konvertiert werden. Ein asynchroner Lambda-Ausdruck kann void, Task oder Task<T> Zurückgeben, von denen keiner in 'Func<HttpResponseMesage>' Konvertierbar ist.

unten ist mein 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

Wie der Fehler besagt, geben asynchrone Methoden Task, Task<T> oder void. Um dies zum Laufen zu bringen, können Sie:

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

Normalerweise gehe ich so vor, dass die Main -Methode eine Run() -Methode aufruft, die einen Task zurückgibt, und .Wait() auf der Task zum Abschließen.

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

Auf diese Weise kann der Rest Ihrer Console-App mit vollständiger Unterstützung für Async/Warten ausgeführt werden. Da in einer Konsolen-App kein UI-Thread vorhanden ist, besteht bei Verwendung von .Wait() kein Deadlock-Risiko.

4

Code fix wie:

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