2015-05-12 44 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中,則控制器會立即返回給調用者