2009-06-14 85 views
1

我有一些簡單的代碼,其中主線程正在創建一個新的任務。該任務反過來產生多個子任務。 主線程在父任務上執行'等待'。我注意到,在多次運行程序時,我沒有得到相同的輸出結果。在下面的代碼中,我打印出每個任務中迭代變量的值,但是在不同的運行中,只有子集被打印出來。我知道執行不是有序的,但它仍然必須完整,因爲我期望打印出100個數字(不按特定順序)。 調用等待是否不等待所有子任務完成? 我運行VS2010 Team System中的Beta1執行和產生子任務時的結果不一致

static void Main(string[] args) 
    { 
     Console.WriteLine("Main executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString()); 

     var task = Task.Factory.StartNew(WriteNumbers); 
     task.Wait(); 

    } 

    private static void WriteNumbers() 
    { 
     Console.WriteLine("WriteNumbers executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString()); 
     for (int i = 0; i < 100; i++) 
     { 
      int localInt = i; 
      Task.Factory.StartNew(() => 
       { 
        Write(localInt); 
       }, TaskCreationOptions.DetachedFromParent); 
     } 
    } 

    private static void Write(int i) 
    {    
     Console.WriteLine("Worker Thread executing on ThreadID:-" + Thread.CurrentThread.ManagedThreadId.ToString() + " Value:" + i.ToString()); 
    } 
+0

聽起來像一個併發問題 – Kareem 2009-06-14 23:52:09

回答

4

MSDN,你需要更多的等待或其他同步,我引用: 「」」 當你等待一個任務,您隱等待的所有兒童除非這些孩子是通過使用DetachedFromParent選項創建的,任何分離的孩子必須單獨等待。 不是使主要隱含等待孩子也是如此,所以主要的(因此也是整個過程)在孩子的任務有機會運行之前可以並且經常會終止。

+0

是啊,我意識到我的錯誤秒後,我的評論(杜) – 2009-06-14 23:55:19

2

我的錯誤:我不小心創建兒童

Task.Factory.StartNew(() => 
      { 
       Write(localInt); 
      }, TaskCreationOptions.DetachedFromParent); 
+0

權當使用DetachedFromParent選項,這就是我的解釋我的回答如上(就在你發佈這個「自我回答」之前)。當然,我不能知道這是一個錯誤 - 這是一件很自然的事情(讓所有的孫子們都可以自由奔跑,只需要等待一段時間),但在Task Parallel Library中顯然不可行,因爲它今天站立。 – 2009-06-14 23:55:06

相關問題