异步/等待执行顺序

时间:2016-10-20 01:14:10

标签: vb.net

这是节目输出:

Program Begin
1 - Starting
2 - Task started
A - Started something
Program End
B - Completed something
3 - Task completed with result: 123

问题:据我所知,当涉及等待进程回到主要上下文时,所以在本例中是 Main 然后当它完成时,回到等待" A - 开始了一些事情"应该在" Program End"之后。为什么显示这一行?根据我对远离的理解,它应该立即回到主要背景。

static void Main(string[] args)
        {
            Console.WriteLine("Program Begin");
            DoAsAsync();
            Console.WriteLine("Program End");
            Console.ReadLine();
        }

        static async void DoAsAsync()
        {
            Console.WriteLine("1 - Starting");
            var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
            Console.WriteLine("2 - Task started");
            var result = await t;
            Console.WriteLine("3 - Task completed with result: " + result);
        }

        static int DoSomethingThatTakesTime()
        {
            Console.WriteLine("A - Started something");
            Thread.Sleep(1000);
            Console.WriteLine("B - Completed something");
            return 123;
        }

2 个答案:

答案 0 :(得分:0)

当谈到等待时,首先触发任务,这里是&#34; DoSomethingThatTakesTime&#34;。然后回到调用方法来执行下一个任务/执行(在这种情况下,它是Main())。

如果你在主要方面有另一个等待,这将意义很大。

请看下面的例子。非常好解释。 https://msdn.microsoft.com/en-us/library/mt674892.aspx

如果在第一个print语句之前调用线程休眠,则可能会看到不同的结果。

答案 1 :(得分:0)

  

据我所知,当等待进程回到主要上下文时,所以在这种情况下是Main,然后回到等待它完成所以“A - Started something”应该在“Program End”之后。< / p>

该线程正在做什么;主线程返回Main方法。

但是,StartNew将(在这种情况下)在线程池线程上执行其工作,该线程独立于主线程运行。因此,您可能会在“程序结束”之前或之后看到“A - Started something”。