web-dev-qa-db-ja.com

非同期メソッドでFuncデリゲートを使用する

非同期メソッドで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();
}
42
maxspan

エラーが示すように、非同期メソッドはTaskTask<T>またはvoidを返します。これを機能させるには、次のことができます。

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

私が通常取るパスは、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()を使用してもデッドロックが発生するリスクはありません。

4

次のようなコード修正:

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