示例
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TaskTest2
{
class Program
{
static void Main(string[] args)
{
Task<Int32> t = Task.Run(()=>Sum(CancellationToken.None, 10000));
//上个任务完成后自动执行下一个任务
//通过TaskContinuationOptions参数为任务指定行为
//之前的任务顺利完成后,执行。
t.ContinueWith(task=>Console.WriteLine("The sum is: " + task.Result), TaskContinuationOptions.OnlyOnRanToCompletion);
//之前的任务失败时,执行。
t.ContinueWith(task=>Console.WriteLine("Sum threw: "+task.Exception.InnerException), TaskContinuationOptions.OnlyOnFaulted);
//之前的任务被取消时,执行。
t.ContinueWith(task => Console.WriteLine("Sum was canceled"), TaskContinuationOptions.OnlyOnCanceled);
Console.ReadLine();
}
private static Int32 Sum(CancellationToken ct, Int32 n)
{
Int32 sum = 0;
for(;n > 0; n--)
checked { sum += n; }
return sum;
}
}
}
运行测试
#region 程序集 mscorlib.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll
#endregion
using System;
namespace System.Threading.Tasks
{
// 摘要:
// 为通过使用 System.Threading.Tasks.Task.ContinueWith(System.Action<System.Threading.Tasks.Task>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)
// 或 System.Threading.Tasks.Task<TResult>.ContinueWith(System.Action<System.Threading.Tasks.Task<TResult>>,System.Threading.Tasks.TaskContinuationOptions)
// 方法创建的任务指定行为。
[Serializable]
[Flags]
public enum TaskContinuationOptions
{
// 摘要:
// Default = "Continue on any, no task options, run asynchronously" 指定应使用默认行为。
// 默认情况下,完成前面的任务之后将安排运行延续任务,而不考虑前面任务的最终 System.Threading.Tasks.TaskStatus。
None = 0,
//
// 摘要:
// 提示 System.Threading.Tasks.TaskScheduler 以一种尽可能公平的方式安排任务,这意味着较早安排的任务将更可能较早运行,而较晚安排运行的任务将更可能较晚运行。
PreferFairness = 1,
//
// 摘要:
// 指定某个任务将是运行时间长、粗粒度的操作。 它会向 System.Threading.Tasks.TaskScheduler 提示,过度订阅可能是合理的。
LongRunning = 2,
//
// 摘要:
// 指定将任务附加到任务层次结构中的某个父级。
AttachedToParent = 4,
//
// 摘要:
// 如果尝试附有子任务到创建的任务,指定 System.InvalidOperationException 将被引发。
DenyChildAttach = 8,
//
// 摘要:
// 防止环境计划程序被视为已创建任务的当前计划程序。 这意味着像 StartNew 或 ContinueWith 创建任务的执行操作将被视为 System.Threading.Tasks.TaskScheduler.Default
// 当前计划程序。
HideScheduler = 16,
//
// 摘要:
// 在延续取消的情况下,防止延续的完成直到完成先前的任务。
LazyCancellation = 32,
//
// 摘要:
// 指定不应在延续任务前面的任务已完成运行的情况下安排延续任务。 此选项对多任务延续无效。
NotOnRanToCompletion = 65536,
//
// 摘要:
// 指定不应在延续任务前面的任务引发了未处理异常的情况下安排延续任务。 此选项对多任务延续无效。
NotOnFaulted = 131072,
//
// 摘要:
// 指定只应在延续任务前面的任务已取消的情况下才安排延续任务。 此选项对多任务延续无效。
OnlyOnCanceled = 196608,
//
// 摘要:
// 指定不应在延续任务前面的任务已取消的情况下安排延续任务。 此选项对多任务延续无效。
NotOnCanceled = 262144,
//
// 摘要:
// 指定只应在延续任务前面的任务引发了未处理异常的情况下才安排延续任务。 此选项对多任务延续无效。
OnlyOnFaulted = 327680,
//
// 摘要:
// 指定只应在延续任务前面的任务已完成运行的情况下才安排延续任务。 此选项对多任务延续无效。
OnlyOnRanToCompletion = 393216,
//
// 摘要:
// 指定应同步执行延续任务。 指定此选项后,延续任务将在导致前面的任务转换为其最终状态的相同线程上运行。 如果在创建延续任务时已经完成前面的任务,则延续任务将在创建此延续任务的线程上运行。
// 只应同步执行运行时间非常短的延续任务。
ExecuteSynchronously = 524288,
}
}