Рассмотрим следующий фрагмент
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();
Какие выходы
Parent starting..
Parent done..
Child #0 starting...
Child #2 starting...
Child #9 starting...
Child #5 starting...
Child #1 starting...
Child #6 starting...
Child #4 starting...
Child #3 starting...
Child #7 starting...
Child #0 done..
Child #1 done..
Child #8 starting...
Child #6 done..
Child #3 done..
Child #5 done..
Child #4 done..
Child #9 done..
Child #2 done..
Child #7 done..
Child #8 done..
Как это возможно?В документации четко указано, что StartNew
(на родительском элементе) имеет параметры создания по умолчанию, что не запрещает дочернему элементу присоединяться к нему.
Почему task.Wait()
на родительском блоке не блокируется до дочерних элементовзавершить?