TaskFactory.ContinueWhenAll Method (Task(), Action(Of 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 Function ContinueWhenAll (
	tasks As Task(),
	continuationAction As Action(Of Task()),
	cancellationToken As CancellationToken
) As Task


Type: System.Threading.Tasks.Task()

The array of tasks from which to continue.

Type: System.Action(Of 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(Of 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.

Imports System.Collections.Generic
Imports System.IO
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim filenames() As String= { "chapter1.txt", "chapter2.txt", 
                                   "chapter3.txt", "chapter4.txt",
                                   "chapter5.txt" }
      Dim pattern As String = "\b\w+\b"
      Dim tasks As New List(Of Task)()  
      Dim source As New CancellationTokenSource()
      Dim token As CancellationToken = source.Token
      Dim totalWords As Integer = 0

      ' Determine the number of words in each file.
      For Each filename In filenames
         tasks.Add( Task.Factory.StartNew( Sub(obj As Object)
                                              Dim fn As String = CStr(obj)
                                              If Not File.Exists(fn) Then 
                                              End If        

                                              Dim sr As New StreamReader(fn.ToString())
                                              Dim content As String = sr.ReadToEnd()
                                              Dim words As Integer = Regex.Matches(content, pattern).Count
                                              Interlocked.Add(totalWords, words) 
                                              Console.WriteLine("{0,-25} {1,6:N0} words", fn, words) 
                                           End Sub, filename, token))

      Dim finalTask As Task = Task.Factory.ContinueWhenAll(tasks.ToArray(), 
                                                           Sub(wordCountTasks As Task())
                                                              If Not token.IsCancellationRequested Then 
                                                                 Console.WriteLine("\n{0,-25} {1,6} total words\n", 
                                                                                   String.Format("{0} files", wordCountTasks.Length), 
                                                              End If                      
                                                           End Sub, token) 
      Catch ae As AggregateException 
         For Each inner In ae.InnerExceptions
            If TypeOf inner Is TaskCanceledException
               Console.WriteLine("Failure to determine total word count: a task was cancelled.")
               Console.WriteLine("Failure caused by {0}", inner.GetType().Name)
            End If 
      End Try                                                                     
   End Sub
End Module
' 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