В чем разница между вложенной задачей и дочерней задачей

мне нравится понимать, в чем разница между Nested Task and Child Task.

var outerTask = Task.Factory.StartNew( () => 
{
    var nestedTask = Task.Factory.StartNew( () => 
    {
         Console.WriteLine("Inside nestedTask");
    });
});


A "child task" looks like this:

var parentTask = Task.Factory.StartNew( () => 
{
    var childTask = Task.Factory.StartNew( () => 
    {
         Console.WriteLine("Inside childTask");
    },               TaskCreationOptions.AttachedToParent );
});

здесь я прикрепил код.

кажется, что когда мы запускаем любую вложенную задачу, внешняя задача может завершиться до внутренней задачи, но в случае дочерней задачи всегда дочерняя задача завершается до родительской задачи. я не уверен, что я прав или нет. поэтому будет полезно, если кто-нибудь подскажет, когда переходить к вложенной задаче, а когда к дочерней задаче с примером сценария. Спасибо


person Thomas    schedule 18.11.2013    source источник


Ответы (3)


Microsoft объясняет это красиво.

Вложенная задача — это просто экземпляр Task, созданный в пользовательском делегате другой задачи. Дочерняя задача — это вложенная задача, созданная с помощью параметра AttachedToParent. Задача может создавать любое количество дочерних и/или вложенных задач, ограниченных только системными ресурсами. В следующем примере показана родительская задача, которая создает одну простую вложенную задачу.

...

Наиболее важным моментом в отношении дочерних и вложенных задач является то, что вложенные задачи по существу независимы от родительской или внешней задачи, тогда как присоединенные дочерние задачи очень тесно синхронизированы с родительской задачей.

http://msdn.microsoft.com/en-us/library/vstudio/dd997417%28v=vs.100%29.aspx

person Gusdor    schedule 18.11.2013
comment
Я рад, что вы добавили вторую часть, потому что первая в основном описывает код аскеров. - person Ondrej Janacek; 18.11.2013
comment
@OndrejJanacek Мне нравится думать, что одной ссылки на официальную документацию будет достаточно. Я вставляю цитату только для того, чтобы не ныть :D - person Gusdor; 18.11.2013
comment
Публиковать просто ссылку - лень :) Выделение важных частей из нее - определенно путь. - person Ondrej Janacek; 18.11.2013
comment
@OndrejJanacek Связанная статья специально посвящена этому вопросу. Это все актуально. Действительно редкий случай! Однако я склонен согласиться, извлечение мяса дает ОП краткий ответ и делает мой вклад профессиональным с шикарной разметкой;) - person Gusdor; 18.11.2013

ИМО, лучшее объяснение можно найти в Запись в блоге Стивена Туба:

... создаваемая Задача регистрируется с этой родительской Задачей как дочерняя, что приводит к двум дополнительным поведениям: родительская Задача не перейдет в завершенное состояние до тех пор, пока не будут завершены все ее дочерние элементы, и любые исключения из дочерних задач, в которых произошел сбой, будут распространяться на родительскую задачу (если только родительская задача не наблюдает эти исключения до своего завершения).

person noseratio    schedule 18.11.2013
comment
+1 за ответ, в котором фактически говорится о ощутимой разнице в поведении (и ссылки на сообщение в блоге, которое уточняет и демонстрирует). Гораздо полезнее, чем расплывчатая, тесно синхронизированная с родительской фразой, найденная в других ответах. - person TypeIA; 08.07.2017

Просто, если одна дочерняя задача не привязана к родительской, эта задача не удалась? Тогда статус родительской задачи по-прежнему будет "RanToCompletion".

var parentTask = Task.Factory.StartNew(() =>
{
    var childTask = Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Inside childTask");
    }, TaskCreationOptions.AttachedToParent);

    var childTask2 = Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000 * 3);
        throw new Exception("Bomb2");
        Console.WriteLine("Inside childTask2");
    }, **TaskCreationOptions.None**);   // If not AttachedToParent, parentTask.Status == RanToCompletion
}).ContinueWith(t =>
{
    Console.WriteLine(t.Status);
});
person user3761555    schedule 11.10.2018