max*_*pan 48 c# lambda asynchronous
我试图使用Func与异步方法.我收到了一个错误.
无法将异步lambda表达式转换为委托类型
'Func<HttpResponseMesage>'
.异步lambda表达式可能返回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();
}
Run Code Online (Sandbox Code Playgroud)
spe*_*der 72
正如错误所说,异步方法返回Task
,Task<T>
或void
.为了让这个工作,您可以:
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
Run Code Online (Sandbox Code Playgroud)
我通常采取的路径是让该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();
}
}
Run Code Online (Sandbox Code Playgroud)
这允许控制台应用程序的其余部分在完全异步/等待支持的情况下运行。由于控制台应用程序中没有任何 UI 线程,因此使用.Wait()
.