Здравствуйте, mDmitriy, Вы писали:
D>var _afters = new[] { after1, after2, after3, after4, after5 };
D>Task.Run(()=>first).ContinueWith((t)=>Parallel.Invoke(_afters));[/cs]
Как я понял по описанию Parallel.Invoke, получится, что ContinueWith запускает Parallel.Invoke и ждет, пока он отработает(т.е. таска ContinueWith будет периодически получать время на выполнение, даже если не все задачи завершены).
Если же сделать как-нибудь через await
Task.Run(() => first()).ContinueWith(async (_) => await Task.WhenAll(Task.Run(after1), Task.Run(after2), Task.Run(after3)))
то таска ContinueWith запустит все задачи и в следующий раз будет разбужена только по завершении всех задач.