1

我有一些简单的代码,其中主线程正在创建一个新任务。该任务又会产生多个子任务。主线程对父任务执行“等待”。我观察到在程序的多次运行中我没有得到相同的输出。在下面的代码中,我打印出每个任务中迭代变量的值,但在不同的运行中,只有子集被打印出来。我知道执行没有顺序,但它仍然必须完成,因为我希望打印出 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());
    }
4

2 回答 2

4

根据MSDN,您需要更多等待或其他同步,我引用:“””当您等待任务时,您会隐式等待该任务的所有子项,除非这些子项是使用 DetachedFromParent 选项创建的。任何分离的子项必须分开等候。"""

在这里,main 等待父进程,但由于父进程的子进程确实被创建为分离的,因此 main 也不会隐式地等待子进程,因此 main(以及整个进程)可以并且经常会在某些子任务完成之前终止一个跑步的机会。

于 2009-06-14T23:51:43.693 回答
2

我的错误:我在创建孩子时不小心使用了 DetachedFromParent 选项

 Task.Factory.StartNew(() => 
            {
               Write(localInt);
            }, TaskCreationOptions.DetachedFromParent);
于 2009-06-14T23:51:53.770 回答