Expand Minimize

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

.NET Framework 4.6 and 4.5

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

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

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

Type Parameters


The type of the result produced by the continuation.


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>.


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.

.NET Framework

Supported in: 4.6, 4.5

Supported in: Windows Phone 8.1

Supported in: Windows Phone Silverlight 8.1

Supported in: Windows Phone Silverlight 8
Was this page helpful?
(1500 characters remaining)
Thank you for your feedback
© 2015 Microsoft