1. ホーム
  2. c#

[解決済み] Mainで非同期メソッドを呼び出すには?

2023-01-03 09:51:35

質問

public class test
{
    public async Task Go()
    {
        await PrintAnswerToLife();
        Console.WriteLine("done");
    }

    public async Task PrintAnswerToLife()
    {
        int answer = await GetAnswerToLife();
        Console.WriteLine(answer);
    }

    public async Task<int> GetAnswerToLife()
    {
        await Task.Delay(5000);
        int answer = 21 * 2;
        return answer;
    }
}

main()メソッドでGoを呼び出したい場合、どのようにすればよいのでしょうか? 私はC#の新機能を試しています。私はイベントに非同期メソッドをフックすることができ、そのイベントをトリガーすることによって、非同期メソッドを呼び出すことができることを知っています。

しかし、私がそれをメインメソッドで直接呼び出したい場合はどうすればよいですか?どのようにそれを行うことができますか?

私は次のようなことをしました。

class Program
{
    static void Main(string[] args)
    {
        test t = new test();
        t.Go().GetAwaiter().OnCompleted(() =>
        {
            Console.WriteLine("finished");
        });
        Console.ReadKey();
    }


}

しかし、デッドロックになっているようで、画面には何も表示されません。

どのように解決するのですか?

あなたの Main メソッドを簡略化することができます。C# 7.1 およびそれ以降の場合。

static async Task Main(string[] args)
{
    test t = new test();
    await t.Go();
    Console.WriteLine("finished");
    Console.ReadKey();
}

C#の以前のバージョンの場合。

static void Main(string[] args)
{
    test t = new test();
    t.Go().Wait();
    Console.WriteLine("finished");
    Console.ReadKey();
}

の美しさの一端はここにあります。 async キーワード (および関連する機能) の優れた点のひとつです。コールバックの使用や混乱を大幅に軽減または排除することができます。