2009-06-14 61 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

相关问题