我正在尝试将 Func 与异步方法一起使用。我收到一个错误。
无法将异步 lambda 表达式转换为委托类型
。异步 lambda 表达式可能返回 void、Task 或'Func<HttpResponseMesage>'
,其中任何一个都不能转换为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();
}
正如错误所述,异步方法返回
Task
、Task<T>
或 void
。因此,要使其发挥作用,您可以:
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
我通常采取的路径是让
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();
}
}
这允许控制台应用程序的其余部分在完全异步/等待支持的情况下运行。由于控制台应用程序中没有任何 UI 线程,因此使用
.Wait()
时不会面临死锁的风险。
代码修复,例如:
static void Main(string[] args)
{
Program p = new Program();
Task<HttpResponseMessage> myTask = p.CallAsyncMethod();
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
Console.ReadLine();
}
Transaction transactionInDb = await new Func<Task<Transaction>>(async () =>
{
return await _repo.Transactions.FirstOrDefaultAsync();
}).Invoke();
在Func内部运行任务,等待它并检查异常,然后返回结果。
Func<HttpResponseMessage> myFun = () =>
{
var t = Task.Run(async () => await myTask);
t.Wait();
if (t.IsFaulted)
throw t.Exception;
return t.Result;
};