2010-08-17 413 views
0

足夠簡單的問題,我只需要突破一個最小的混亂牆。C#等待和多線程

因此,基於下面的簡單代碼:

Task task1 = new Task(() => 
      { 
       for (int i = 0; i < 500; i++) 
       { 
        Console.WriteLine("X"); 
       } 
      }); 

     task1.Start(); 
     task1.Wait(); 

     for (int j = 0; j < 500; j++) 
     { 
      Console.WriteLine("Y"); 
     } 

     Console.ReadLine(); 
  1. 因此,基於上述情況,將任務是在它自己單獨的線程和主線程上的其他代碼?

  2. 現在就等待而言,我很困惑,因爲我正在指示等待什麼。所以,回到上面的例子,假設現在任務1有工作的一個瘋狂的金額做,在主線程只存在一條語句象下面這樣:

    Task task1 = new Task(() => 
         { 
          //insane amount of work to do which might take a while 
         }); 
        task1.Start(); 
        task1.Wait(); 
        Console.WriteLine("HI"); 
    
        Console.ReadLine(); 
    

是等待正好擋住了線程Task1已打開?如果是這樣,那麼在task1完成之前,不應該允許其他線程(主線程)和WriteLine語句執行嗎?還是等待說「沒有線程會運行,直到我完成」?

回答

2
  1. 該任務計劃在當前TaskScheduler中執行,這意味着它將運行在不同的線程中。

  2. 等待指示主線程等待,直到任務完成。

+0

啊好吧,等等總是指向主線程。我假設這意味着那麼其他任務(如果我有多個任務)在其他線程上仍然可以發生上下文切換? – Ilya 2010-08-17 22:21:58

1

task1一個將運行在一個單獨的線程。 task1.Wait()指示主線程等待task1完成執行。

1

等待導致調用線程等待任務完成。本質上,這段代碼所做的是在兩個線程之間同步運行,並且比只在一個線程上運行它沒有獲得諸如釋放UI線程之類的任何好處花費的時間要長。