2015-05-12 45 views
0

不应该await Subtask()调用立即返回到主要功能控制? 当我运行这个程序时,它实际上会一直等到长时间运行的double for循环(在子任务内)完成,并且只有在调用以下Task.Delay()后才返回到main。 为什么在等待子任务()被调用后不会立即返回?如果等待的任务有一个长时间运行的CPU操作,等待呼叫不会返回呼叫给呼叫者

static void Main(string[] args) 
{ 
    Console.WriteLine("Main() threadId: " + Thread.CurrentThread.ManagedThreadId); 
    SuperTask(); 
    Console.Read(); 
} 

static async Task SuperTask() 
{ 
    Console.WriteLine("SuperTask threadId: " + Thread.CurrentThread.ManagedThreadId); 
    await SubTask(); 
} 

static async Task SubTask() 
{ 
    Console.WriteLine("ThreadId for SubTask before await is: " + Thread.CurrentThread.ManagedThreadId); 
    var x = 0; 
    for (var i = 0; i < 25000; i++) 
    { 
     for (var j = 0; j < 250000; j++) 
     { 
      x -= i; 
     } 
    } 
    await Task.Delay(10000); 
    Console.WriteLine("ThreadId for SubTask is: " + Thread.CurrentThread.ManagedThreadId); 
} 
+1

您没有观察到代码中的任何编译器警告? – Alex

+0

只是建议我等待Main方法中调用SuperTask()的那个人 – Abhi

回答

1

正如我在我的async intro中解释的,async关键字不会启动一个新线程或任何类似疯狂的东西。每个async方法开始同步执行。

+0

在这种情况下,一旦它看到行“await SubTask()”,SuperTask()不应该将控制权返回给Main?为什么在释放对Main的控制权之前,它在等待Subtask内部的等待? – Abhi

+0

@Abhi:因为'await SubTask();'与'Task subTask = SubTask()'相同。等待子任务;'。 –

1

这是设计方案,Subtask()方法一旦达到await声明并且启动await Delay操作就会返回。我多解释一下here

0

这是设计。等待开始作为一个同步调用,直到它找到另一个在调用链中等待,这实际上导致一个线程创建。在你的情况下,这是直到调用Task.Delay实际上创建一个线程(这是什么都没做,只是在这种情况下等待10秒),但现在可以返回调用者。在其他情况下,如果您将循环代码放在Task.Run中,则控制器会立即返回给调用者