Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TaskCreationOptions.AttachedToParent,父任务未等待子任务完成_C#_Task - Fatal编程技术网

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循环的每次迭代都将被挂起,并使在循环中创建任务变得毫无意义。

我知道我可以这样做来修复代码,问题是它为什么不做我所理解的有文档记录的和预期的行为,即在父任务和子任务之间创建依赖关系,这样,直到所有的孩子都完成了,家长才完成。你搞错了,纠正了家长的错误。。。不提它的输出。。。我的错!很高兴你得到你的答案=我知道我可以这样做来修复我的代码,问题是为什么它不做我所理解的有文档记录的和预期的行为,即在父级和子级之间创建依赖关系,这样父级直到所有子级完成才完成。你搞错了,修复了父级。。。不提它的输出。。。我的错!很高兴你得到了答案=啊,这很有道理。我确实明白你的第三点,也许我可以把这个问题说得更好,我想。等到所有孩子的执行上下文都向父母发出他们已经完成的信号时,我就会阻止。啊,这很有道理。我确实明白你的第三点,也许我可以把这个问题说得更好,我想。等待会阻止,直到所有子项的执行上下文向父项发出它们已完成的信号。