执行和生成子任务时的结果不一致

时间:2009-06-14 23:46:03

标签: .net-4.0 plinq task-parallel-library

我有一些简单的代码,主线程正在创建一个新的Task。该任务反过来产生多个子任务。 主线程对父任务执行“等待”。我观察到我在程序的多次运行中没有获得相同的输出。在下面的代码中,我在每个任务中打印出迭代变量的值,但是在不同的运行中,只打印出子集。我知道执行不是有序的,但它仍然必须完整,因为我期望打印出100个数字(没有特定的顺序)。 调用Wait是否等待所有子任务完成? 我正在运行VS2010 Team系统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());
    }

2 个答案:

答案 0 :(得分:4)

MSDN,您需要更多等待或其他同步,我引述: “”” 当您等待任务时,您将隐式等待该任务的所有子项,除非这些子项是使用DetachedFromParent选项创建的。任何独立的孩子必须单独等待。 “”“

这里,main等待父级,但是由于父级的子级确实被创建为已分离,因此使得main主动等待子级,因此main(因此整个过程)可以并且通常会在某个子任务有机会运行之前终止。

答案 1 :(得分:2)

我的错误:我在创建子项时意外使用了DetachedFromParent选项

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