Task<TResult>.ContinueWith<TNewResult> Method (Func<Task<TResult>, Object, TNewResult>, Object)

.NET Framework (current version)

The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.

Creates a continuation that executes when the target Task<TResult> completes.

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

public Task<TNewResult> ContinueWith<TNewResult>(
	Func<Task<TResult>, object, TNewResult> continuationFunction,
	object state


Type: System.Func<Task<TResult>, Object, TNewResult>

A function to run when the Task<TResult> completes. When run, the delegate will be passed the completed task and the caller-supplied state object as arguments.

Type: System.Object

An object representing data to be used by the continuation function.

Return Value

Type: System.Threading.Tasks.Task<TNewResult>

A new continuation Task<TResult>.

Type Parameters


The type of the result produced by the continuation.

Exception Condition

The continuationFunction argument is null.

The returned Task<TResult> 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 creates a chain of continuation tasks. Each task provides the current time, a DateTime object, for the state argument of the ContinueWith(Action<Task, Object>, Object) method. Each DateTime value represents the time at which the continue task is created. Each task produces as its result a second DateTime value that represents the time at which the task finishes. After all tasks finish, the example displays the date and times at which each continuation task starts and finishes.

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

// Demonstrates how to associate state with task continuations.
class ContinuationState
   // Simluates a lengthy operation and returns the time at which
   // the operation completed.
   public static DateTime DoWork()
      // Simulate work by suspending the current thread 
      // for two seconds.

      // Return the current time.
      return DateTime.Now;

   static void Main(string[] args)
      // Start a root task that performs work.
      Task<DateTime> t = Task<DateTime>.Run(delegate { return DoWork(); });

      // Create a chain of continuation tasks, where each task is 
      // followed by another task that performs work.
      List<Task<DateTime>> continuations = new List<Task<DateTime>>();
      for (int i = 0; i < 5; i++)
         // Provide the current time as the state of the continuation.
         t = t.ContinueWith(delegate { return DoWork(); }, DateTime.Now);

      // Wait for the last task in the chain to complete.

      // Print the creation time of each continuation (the state object)
      // and the completion time (the result of that task) to the console.
      foreach (var continuation in continuations)
         DateTime start = (DateTime)continuation.AsyncState;
         DateTime end = continuation.Result;

         Console.WriteLine("Task was created at {0} and finished at {1}.",
            start.TimeOfDay, end.TimeOfDay);

/* Sample output:
Task was created at 10:56:21.1561762 and finished at 10:56:25.1672062.
Task was created at 10:56:21.1610677 and finished at 10:56:27.1707646.
Task was created at 10:56:21.1610677 and finished at 10:56:29.1743230.
Task was created at 10:56:21.1610677 and finished at 10:56:31.1779883.
Task was created at 10:56:21.1610677 and finished at 10:56:33.1837083.

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