非同期メソッドでFuncを使用しようとしています。そして、エラーが発生しています。
非同期ラムダ式をデリゲート型
'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();
}
エラーが示すように、非同期メソッドはTask
、Task<T>
またはvoid
を返します。これを機能させるには、次のことができます。
Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
私が通常取るパスは、Main
メソッドがタスクを返すRun()
メソッドを呼び出し、Task
で.Wait()
を完了させることです。
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();
}