一尘不染

如何在Main中调用异步方法?

c#

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#的新功能,我知道我可以将异步方法挂接到事件上,并通过触发该事件,可以调用异步方法。

但是,如果我想直接在main方法中调用它怎么办?我怎样才能做到这一点?

我做了类似的事情

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


}

但是似乎这是一个死锁,屏幕上没有任何内容。


阅读 833

收藏
2020-05-19

共1个答案

一尘不染

您的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关键字(及相关功能)之美的一部分:大大减少或消除了回调的使用和混乱。

2020-05-19