Насколько я понимаю, метод ContinueWith ждет завершения заданий. В случае следующего кода это означает, что он закончен, когда он выполняется с его дочерними задачами. Если это так, то почему оно иногда выводится 0 0 0 и в других случаях 0 1 2?Почему дочерние задачи не заканчиваются раньше. Продолжение?
static void Main(string[] args)
{
Task<Int32[]> parent = Task.Run(() =>
{
var results = new Int32[3];
new Task(() => results[0] = 0, TaskCreationOptions.AttachedToParent).Start();
new Task(() => results[1] = 1, TaskCreationOptions.AttachedToParent).Start();
new Task(() => results[2] = 2, TaskCreationOptions.AttachedToParent).Start();
return results;
});
var finalTask = parent.ContinueWith(n =>
{
foreach (Int32 i in n.Result)
Console.WriteLine(i);
});
finalTask.Wait();
Console.ReadLine();
}
@HansPassant: На поверхности он выглядит как ребенок задачи привязаны к родителю поэтому родитель не будет завершен до тех пор, пока у детей не будет. Таким образом, OP написал код, который предназначен для правильного использования 'ContinueWith'. Проблема в том, что он не выбрал ожидаемое исключение, когда дочерние задачи не подключались к родительскому элементу. Незначительные изменения кода прекрасно в состоянии получить желаемый результат, не касаясь 'ContinueWith'. – Chris