Expand Minimize

Task.ContinueWith Method (Action<Task>)

Creates a continuation that executes asynchronously when the target Task completes.

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

public Task ContinueWith(
	Action<Task> continuationAction


Type: System.Action<Task>

An action to run when the Task completes. When run, the delegate will be passed the completed task as an argument.

Return Value

Type: System.Threading.Tasks.Task
A new continuation Task.


The CancellationTokenSource that created cancellationToken has already been disposed.


The continuationAction argument is null.

The returned Task will not be scheduled for execution until the current task has completed, whether it completes due to running to completion successfully, faulting due to an unhandled exception, or exiting out early due to being canceled.

The following example defines a task that populates an array with 100 random date and time values. It uses the ContinueWith(Action<Task>) method to select the earliest and the latest date values once the array is fully populated.

using System;
using System.Threading.Tasks;

public class Example
   public static void Main()
      DateTime[] dates = new DateTime[100];

      Task dTask = Task.Factory.StartNew( () => {
                               Random rnd = new Random();
                               Byte[] buffer = new Byte[8];
                               int ctr = dates.GetLowerBound(0);
                               while (ctr <= dates.GetUpperBound(0)) {
                                  long ticks = BitConverter.ToInt64(buffer, 0);
                                  if (ticks <= DateTime.MinValue.Ticks | ticks >= DateTime.MaxValue.Ticks)

                                  dates[ctr] = new DateTime(ticks);
                            } ); 

      Task dTask2 = dTask.ContinueWith( (continuation) => {
                             DateTime earliest = dates[0];
                             DateTime latest = earliest;

                             for (int ctr = dates.GetLowerBound(0) + 1; ctr <= dates.GetUpperBound(0); ctr++) {
                                if (dates[ctr] < earliest) earliest = dates[ctr];
                                if (dates[ctr] > latest) latest = dates[ctr];
                             Console.WriteLine("Earliest date: {0}", earliest);
                             Console.WriteLine("Latest date: {0}", latest);
                          } );                      
      // Since a console application otherwise terminates, wait for both tasks to complete.
      Task.WaitAll( new Task[] {dTask, dTask2} );
// The example displays output like the following: 
//       Earliest date: 2/11/0110 12:03:41 PM 
//       Latest date: 7/29/9989 2:14:49 PM

Because a console application may terminate before the continuation task executes, the WaitAll method is called to ensure that both the original task and its continuation finish executing before the example ends.

For an additional example, see Continuation Tasks.

.NET Framework

Supported in: 4.5.2, 4.5.1, 4.5, 4

.NET Framework Client Profile

Supported in: 4

Portable Class Library

Supported in: Portable Class Library

.NET for Windows Store apps

Supported in: Windows 8

.NET for Windows Phone apps

Supported in: Windows Phone 8.1, Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Was this page helpful?
(1500 characters remaining)
Thank you for your feedback
© 2014 Microsoft