Подтвердить что ты не робот

Использование делегата Func с методом Async

Я пытаюсь использовать Func с методом Async. И я получаю сообщение об ошибке.

Невозможно преобразовать выражение async lambda для делегирования типа 'Func<HttpResponseMesage>'. Асинхронное лямбда-выражение может возвращать void, Task или Task<T>, ни одна из которых не конвертируется в 'Func<HttpResponseMesage>'.

ниже мой код:

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

Ответ 1

Как говорится в ошибке, методы async возвращают Task, Task<T> или void. Чтобы заставить это работать, вы можете:

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

Ответ 2

Исправление кода, например:

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

Ответ 3

Обычно я использую путь, чтобы метод Main вызывал метод Run(), который возвращает задачу, и .Wait() в Task для завершения.

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

Это позволяет остальной части вашего консольного приложения работать с полной поддержкой async/wait. Поскольку в консольном приложении нет ни одного потока пользовательского интерфейса, вы не рискуете заторможенностью с использованием .Wait().