Ответ 1
Как говорится в ошибке, методы async возвращают Task
, Task<T>
или void
. Чтобы заставить это работать, вы можете:
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
Я пытаюсь использовать 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();
}
Как говорится в ошибке, методы async возвращают Task
, Task<T>
или void
. Чтобы заставить это работать, вы можете:
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
Исправление кода, например:
static void Main(string[] args)
{
Program p = new Program();
Task<HttpResponseMessage> myTask = p.CallAsyncMethod();
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
Console.ReadLine();
}
Обычно я использую путь, чтобы метод 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()
.