谁能帮我理解c#中的await/async实现

Adi*_*tya 0 c# async-await

当使用 await 的方法本身没有被等待时,调用方法的执行会在被调用方法完成之前继续执行

我从这里得到了这个理解https://www.pluralsight.com/guides/understand-control-flow-async-await

我试图通过一个简单的程序来实现我对 async/await 的理解。我想象输出为:“完成”将在CallMethodAsync()完全执行之前打印,因为我已经使用await从那里调用了两个单独的异步方法,但它是同步运行的,就好像根本没有实现 async-await 一样。

我想在CallMethodAsync的完整执行完成之前打印完成。让我知道在哪里,我在这里做错了什么?

我已经在 StackOverflow 上看到过其他帖子,但我想,无法确切理解 async-await 是如何工作的。

    class Program
    {

        public static void Main(string[] args)
        {
            TestAsync a = new TestAsync();

            a.CallMethodAync();
            Console.WriteLine("Finish");
        }
    }
    class TestAsync
    {
        public async Task Method1Async()
        {
            for(int i = 1; i <= 100; i++)
            {
                Console.WriteLine("Method 1: " + i);
            }
        }

        public async Task Method2Async()
        {
            for (int i = 1; i <= 100; i++)
            {
                Console.WriteLine("Method 2: " + i);
            }
        }

        public async Task<int> CallMethodAync()
        {
            Console.WriteLine("Before mehtod 1");
            await Method1Async();
            Console.WriteLine("After method 1. before method 2");
            await Method2Async();
            Console.WriteLine("after method 2");
            return 1;
        }

    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

编译代码时,您应该收到警告,提示您出了什么问题:

警告 CS4014:由于不等待此调用,因此在调用完成之前会继续执行当前方法。考虑将“await”运算符应用于调用结果。

异步方法将同步运行,直到它到达第一个await表达式,其中它正在等待的值尚未完成。

在您的情况下,您的所有异步方法都返回已完成的任务 -Method1Async并且Method2Async将简单地同步运行,然后返回一个已完成的任务,这意味着CallMethodAsync将等待那些已经完成的任务,并且本身同步完成。

如果您await Task.Yield()Method1Asyncand 中添加类似的内容Method2Async那么您将看到真正的异步行为:这些方法将返回未完成的任务(当它们到达 时Task.Yield),这意味着CallMethodAsync它本身将返回未完成的任务等。