TaskFactory.ContinueWhenAll Method (Task[], Action<Task[]>, CancellationToken)


Creates a continuation task that starts when a set of specified tasks has completed.

Namespace:   System.Threading.Tasks
Assembly:  mscorlib (in mscorlib.dll)

public Task ContinueWhenAll(
	Task[] tasks,
	Action<Task[]> continuationAction,
	CancellationToken cancellationToken


Type: System.Threading.Tasks.Task[]

The array of tasks from which to continue.

Type: System.Action<Task[]>

The action delegate to execute when all tasks in the tasks array have completed.

Type: System.Threading.CancellationToken

The cancellation token to assign to the new continuation task.

Return Value

Type: System.Threading.Tasks.Task

The new continuation task.

Exception Condition

An element in the tasks array has been disposed.


The CancellationTokenSource that created cancellationToken has already been disposed.


The tasks array is null.


The continuationAction argument is null.


The tasks array is empty or contains a null value.

The ContinueWhenAll(Task[], Action<Task[]>, CancellationToken) method executes the continuationAction delegate when all tasks in the tasks array have completed, regardless of their completion status.

The following example creates a cancellation token, which it passes to separate tasks that use a regular expression to count the number of words in a set of text files. The cancellation token is set if a file cannot be found. The ContinueWhenAll method is used to launch a task that displays the total word count when all the antecedent tasks have completed. If the cancellation token is set, which indicates that one or more tasks have been cancelled, it handles the AggregateException exception and displays an error message.

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

public class Example
   public static void Main()
      string[] filenames = { "chapter1.txt", "chapter2.txt", 
                             "chapter3.txt", "chapter4.txt",
                             "chapter5.txt" };
      string pattern = @"\b\w+\b";
      var tasks = new List<Task>();  
      CancellationTokenSource source = new CancellationTokenSource();
      CancellationToken token = source.Token;
      int totalWords = 0;

      // Determine the number of words in each file.
      foreach (var filename in filenames)
         tasks.Add( Task.Factory.StartNew( fn => { token.ThrowIfCancellationRequested(); 

                                                   if (! File.Exists(fn.ToString())) {

                                                   StreamReader sr = new StreamReader(fn.ToString());
                                                   String content = sr.ReadToEnd();
                                                   int words = Regex.Matches(content, pattern).Count;
                                                   Interlocked.Add(ref totalWords, words); 
                                                   Console.WriteLine("{0,-25} {1,6:N0} words", fn, words); }, 
                                           filename, token));

      var finalTask = Task.Factory.ContinueWhenAll(tasks.ToArray(), wordCountTasks => {
                                                    if (! token.IsCancellationRequested) 
                                                       Console.WriteLine("\n{0,-25} {1,6} total words\n", 
                                                                         String.Format("{0} files", wordCountTasks.Length), 
                                                   }, token); 
      try {                                                   
      catch (AggregateException ae) {
         foreach (Exception inner in ae.InnerExceptions)
            if (inner is TaskCanceledException)
               Console.WriteLine("\nFailure to determine total word count: a task was cancelled.");
               Console.WriteLine("\nFailure caused by {0}", inner.GetType().Name);      
      finally {
// The example displays output like the following:
//       chapter2.txt               1,585 words
//       chapter1.txt               4,012 words
//       Failure to determine total word count: a task was cancelled.

Universal Windows Platform
Available since 8
.NET Framework
Available since 4.0
Portable Class Library
Supported in: portable .NET platforms
Available since 5.0
Windows Phone Silverlight
Available since 8.0
Windows Phone
Available since 8.1
Return to top