So here is my code
Task parent = Task.Run(() =>
{
var result = new int[3];
TaskFactory tf = new TaskFactory(TaskCreationOptions.Atta
Please use the code as below:
static void RunParentTask()
{
Task<int[]> parent = Task.Factory.StartNew<int[]>(() =>
{
var results = new int[3];
TaskFactory<int> factory = new TaskFactory<int>(TaskCreationOptions.AttachedToParent,
TaskContinuationOptions.ExecuteSynchronously);
factory.StartNew(() => results[0] = 1);
factory.StartNew(() => results[1] = 2);
factory.StartNew(() => results[2] = 3);
return results;
});
parent.Wait();
foreach (var item in parent.Result)
{
Console.WriteLine(item);
}
}
In Task.Run's documentation, you'll find that it specifies
Its CreationOptions property value is TaskCreationOptions.DenyChildAttach.
So, even though you specify TaskCreationOptions.AttachedToParent
, it is ignored.
This behaviour is due to your use of the Task.Run method, which forbids child tasks from being attached to the parent:
The
Run
method is a simpler alternative to the StartNew method. It creates a task [whose] CreationOptions property value is TaskCreationOptions.DenyChildAttach.
To resolve, simply change your first line from
Task<int[]> parent = Task.Run(() =>
to
Task<int[]> parent = Task.Factory.StartNew(() =>