这是节目输出:
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;
}
答案 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”。