Expand Minimize

Task<TResult>.ContinueWith Method (Action<Task<TResult>>)

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

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

public Task ContinueWith(
	Action<Task<TResult>> continuationAction
)

Parameters

continuationAction
Type: System.Action<Task<TResult>>

An action to run when the antecedent Task<TResult> 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.

ExceptionCondition
ObjectDisposedException

The Task<TResult> has been disposed.

ArgumentNullException

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 early due to being canceled.

The following example creates an antecedent task that uses the Sieve of Eratosthenes to calculate the prime numbers between 1 and a value entered by the user. An array is used to hold information about the prime numbers. The array index represents the number, and the element's value indicates whether that number is composite (its value is true) or prime (its value is false). This task is then passed to a continuation task, which is responsible for extracting the prime numbers from the integer array and displaying them.

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

public class Example
{
   public static void Main(string[] args)
   {
      int upperBound = args.Length >= 1 ? Int32.Parse(args[0]) : 200;

      var t1 = Task.Run(() => { // True = composite. 
                                // False = prime. 
                                bool[] values = new bool[upperBound + 1];
                                for (int ctr = 2; ctr <= (int) Math.Sqrt(upperBound); ctr++) {
                                   if (values[ctr] == false) {
                                      for (int product = ctr * ctr; product <= upperBound;
                                                                    product = product + ctr)
                                         values[product] = true;
                                   }
                                }
                                return values; });
      var t2 = t1.ContinueWith( (antecedent) => { // Create a list of prime numbers. 
                                                  var  primes = new List<int>();
                                                  bool[] numbers = antecedent.Result;
                                                  string output = String.Empty;

                                                  for (int ctr = 1; ctr <= numbers.GetUpperBound(0); ctr++)
                                                     if (numbers[ctr] == false)
                                                        primes.Add(ctr);

                                                  // Create the output string. 
                                                  for (int ctr = 0; ctr < primes.Count; ctr++) {
                                                     output += primes[ctr].ToString("N0");
                                                     if (ctr < primes.Count - 1)
                                                        output += ",  ";
                                                     if ((ctr + 1) % 8 == 0)
                                                        output += Environment.NewLine;
                                                  }
                                                  //Display the result.
                                                  Console.WriteLine("Prime numbers from 1 to {0}:\n",
                                                                    upperBound);
                                                  Console.WriteLine(output);
                                                });
      try {
         t2.Wait();
      }
      catch (AggregateException ae) {
         foreach (var e in ae.InnerExceptions)
            Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message);
      }
   }
}
// The example displays output like the following: 
//       Prime numbers from 1 to 400: 
// 
//       1,  2,  3,  5,  7,  11,  13,  17, 
//       19,  23,  29,  31,  37,  41,  43,  47, 
//       53,  59,  61,  67,  71,  73,  79,  83, 
//       89,  97,  101,  103,  107,  109,  113,  127, 
//       131,  137,  139,  149,  151,  157,  163,  167, 
//       173,  179,  181,  191,  193,  197,  199,  211, 
//       223,  227,  229,  233,  239,  241,  251,  257, 
//       263,  269,  271,  277,  281,  283,  293,  307, 
//       311,  313,  317,  331,  337,  347,  349,  353, 
//       359,  367,  373,  379,  383,  389,  397,  401

.NET Framework

Supported in: 4.6, 4.5, 4

.NET Framework Client Profile

Supported in: 4

Portable Class Library

Supported in: Portable Class Library

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
Show:
© 2015 Microsoft