Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有人能帮我理解c中的wait/async实现吗_C#_Async Await - Fatal编程技术网

C# 有人能帮我理解c中的wait/async实现吗

C# 有人能帮我理解c中的wait/async实现吗,c#,async-await,C#,Async Await,当使用await的方法本身未被等待时,调用方法的执行将在被调用方法完成之前继续 我从这里得到了这种理解 我试图通过一个简单的程序来实现我对async/await的理解。 我将输出想象为:Finish将在CallMethodAsync完全执行之前打印,因为我使用await调用了两个单独的异步方法,但是它是同步运行的,好像根本没有实现async await一样 我想在完成CallMethodAsync的执行之前打印finish。让我知道我在哪里做错了什么 我看过其他关于StackOverflow的文

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

我从这里得到了这种理解

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

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

我看过其他关于StackOverflow的文章,但我想,我不能确切地理解async Wait是如何工作的

    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;
        }

    }

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

警告CS4014:由于未等待此调用,因此当前方法的执行将在调用完成之前继续。考虑将“Acess”运算符应用到调用的结果。< /P> 异步方法将同步运行,直到到达其等待的值尚未完成的第一个等待表达式

在您的情况下,所有异步方法都会返回已完成的任务—Method1Async和Method2Async只需同步运行,然后返回已完成的任务,这意味着CallMethodAsync将等待那些已完成的任务,而其自身也会同步完成


如果在Method1Async和Method2Async中添加类似Wait Task.Yield的内容,那么您将看到真正的异步行为:这些方法到达Task时将返回不完整的任务。Yield意味着CallMethodAsync本身将返回不完整的任务,等等。

在等待任务之前,请尝试将任务存储在变量中,这样您就有机会观察它的属性,等等。var task=Method1Async;