我有一些简单的代码,主线程正在创建一个新的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());
}
答案 0 :(得分:4)
每MSDN,您需要更多等待或其他同步,我引述: “”” 当您等待任务时,您将隐式等待该任务的所有子项,除非这些子项是使用DetachedFromParent选项创建的。任何独立的孩子必须单独等待。 “”“
这里,main等待父级,但是由于父级的子级确实被创建为已分离,因此不使得main主动等待子级,因此main(因此整个过程)可以并且通常会在某个子任务有机会运行之前终止。
答案 1 :(得分:2)
我的错误:我在创建子项时意外使用了DetachedFromParent选项
Task.Factory.StartNew(() =>
{
Write(localInt);
}, TaskCreationOptions.DetachedFromParent);