2014-10-28 63 views
0

我正在測試異步/等待,這是問題所在。我正在異步啓動兩個任務並等待其執行完成。我期望這兩個任務等待相應的延遲,然後返回打印總毫秒數。但該計劃只打印1 start " + current time2 start " + current time但之後沒有。我如何從推遲的任務中返回並打印最終結果?Task.Delay不返回主線程

static void Main(string[] args) 
    { 
     RunTasksWithDelays(); 
    } 

    static async void RunTasksWithDelays() 
    { 
     Stopwatch s = Stopwatch.StartNew(); 

     Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 
     Task task1 = LongRunningTask1(); 
     Task task2 = LongRunningTask2(); 

     await Task.WhenAll(task1, task2); 
     Console.WriteLine("total milliseconds elapsed: " + s.ElapsedMilliseconds/1000); 

    } 

    static async Task LongRunningTask1() 
    { 
     Console.WriteLine("1 start " + DateTime.Now); 
     await Task.Delay(5000); 
     Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 
     Console.WriteLine("1 end " + DateTime.Now); 

    } 

    static async Task LongRunningTask2() 
    { 
     Console.WriteLine("2 start " + DateTime.Now); 
     await Task.Delay(2000); 
     Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 
     Console.WriteLine("2 end " + DateTime.Now); 

    } 

回答

4

你的主要線頭,從而程序結束,因爲在你的應用程序保持程序活着沒有前臺線程。

理想情況下,你應該等待RunTasksWithDelays方法,但你不能期待它的原因有兩個

  1. 你的方法不返回Task
  2. Main方法不支持await

你應該使RunTasksWithDelays方法返回async Task而不是async void,你應該等待它的完成。同步等待是一個糟糕的主意,在這種情況下沒問題,因爲我們沒有任何選擇。

static void Main(string[] args) 
{ 
    RunTasksWithDelays().Wait(); 
} 

static async Task RunTasksWithDelays() 
{ 
    ... 
} 
+0

這有效。我知道我需要等待,但不知道如何在主內進行。 – Sam 2014-10-28 08:08:03

+0

有沒有辦法知道在完整執行過程中產生了多少線程? – Sam 2014-10-28 08:57:43

+0

@Sam不,沒有。操作本來可以完成,沒有任何單線程或N個線程。沒有辦法找出(AFAIK)。 – 2014-10-28 08:59:46

2

你的方法RunTasksWithDelays應該返回任務呼叫者等待這個任務完成。

然後,你可以簡單地調用RunTasksWithDelays().Wait();

+1

'RunTasksWithDelays'是一個void方法。 – 2014-10-28 07:26:45

+0

好抓,我看到了異步關鍵字和我的大腦插入了Task。 – 2014-10-28 07:28:05