C# TaskCreationOptions.AttachedToParent,父任务未等待子任务完成
考虑以下代码段C# TaskCreationOptions.AttachedToParent,父任务未等待子任务完成,c#,task,C#,Task,考虑以下代码段 var task = Task.Factory.StartNew(() => { Console.WriteLine("Parent starting.."); for (var i = 0; i < 10; ++i) Task.Factory.StartNew(obj => { Console.
var task = Task.Factory.StartNew(() =>
{
Console.WriteLine("Parent starting..");
for (var i = 0; i < 10; ++i)
Task.Factory.StartNew(obj =>
{
Console.WriteLine($"\tChild #{obj} starting...");
Thread.Sleep(1000);
Console.WriteLine($"\tChild #{obj} done..");
}, i, TaskCreationOptions.AttachedToParent);
Console.WriteLine("Parent done..");
});
task.Wait();
这怎么可能?文档中明确指出,父对象上的StartNew具有默认创建选项,这不会拒绝子对象附加到它
为什么不是任务。等待父项阻塞直到子项完成?您的父项任务是生成子项。它完成了。之后孩子们需要照顾自己 如果您希望您的父母等待其子女,您可以执行以下操作:
var task = Task.Factory.StartNew(() =>
{
System.Console.WriteLine("Parent starting..");
var childTasks = new Task[10];
for (var i = 0; i < 10; ++i)
{
childTasks[i] = Task.Factory.StartNew(obj =>
{
System.Console.WriteLine($"\tChild #{obj} starting...");
Thread.Sleep(1000);
System.Console.WriteLine($"\tChild #{obj} done..");
}, i, TaskCreationOptions.AttachedToParent);
}
Task.WaitAll(childTasks);
});
task.Wait();
System.Console.WriteLine("Parent done..");
你父母的任务是让孩子长大。它完成了。之后孩子们需要照顾自己 如果您希望您的父母等待其子女,您可以执行以下操作:
var task = Task.Factory.StartNew(() =>
{
System.Console.WriteLine("Parent starting..");
var childTasks = new Task[10];
for (var i = 0; i < 10; ++i)
{
childTasks[i] = Task.Factory.StartNew(obj =>
{
System.Console.WriteLine($"\tChild #{obj} starting...");
Thread.Sleep(1000);
System.Console.WriteLine($"\tChild #{obj} done..");
}, i, TaskCreationOptions.AttachedToParent);
}
Task.WaitAll(childTasks);
});
task.Wait();
System.Console.WriteLine("Parent done..");
因为你的打印完成了。。从父任务中。此时,父任务仍在执行,附加的子任务不相关
只有当任务的代码将控制权返回给TPL时,它才会考虑是否附加了任何子项,从而考虑是否将任务对象标记为已完成
附加的子任务不会任意阻止父任务的执行,直到该任务完成。如果是这样,也在父任务中运行的for循环的每个迭代都将被挂起,并使在循环中创建任务变得毫无意义。因为您打印的父任务已完成。。从父任务中。此时,父任务仍在执行,附加的子任务不相关
只有当任务的代码将控制权返回给TPL时,它才会考虑是否附加了任何子项,从而考虑是否将任务对象标记为已完成
附加的子任务不会任意阻止父任务的执行,直到该任务完成。如果是这样的话,同样在父任务中运行的for循环的每次迭代都将被挂起,并使在循环中创建任务变得毫无意义。我知道我可以这样做来修复代码,问题是它为什么不做我所理解的有文档记录的和预期的行为,即在父任务和子任务之间创建依赖关系,这样,直到所有的孩子都完成了,家长才完成。你搞错了,纠正了家长的错误。。。不提它的输出。。。我的错!很高兴你得到你的答案=我知道我可以这样做来修复我的代码,问题是为什么它不做我所理解的有文档记录的和预期的行为,即在父级和子级之间创建依赖关系,这样父级直到所有子级完成才完成。你搞错了,修复了父级。。。不提它的输出。。。我的错!很高兴你得到了答案=啊,这很有道理。我确实明白你的第三点,也许我可以把这个问题说得更好,我想。等到所有孩子的执行上下文都向父母发出他们已经完成的信号时,我就会阻止。啊,这很有道理。我确实明白你的第三点,也许我可以把这个问题说得更好,我想。等待会阻止,直到所有子项的执行上下文向父项发出它们已完成的信号。