示例:用一个CancellationTokenSource取消Task
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TaskTest1
{
class Program
{
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
//调用静态Run方法会自动创建Task对象并立即调用Start
//如果一个任务还没开始就试图取消它,会抛出一个InvalidOperationException
Task<Int32> t = Task.Run(()=>Sum(cts.Token, 1000000000), cts.Token);
//在之后的某个时间,取消CancellationTokenSource以取消Task
//这是异步请求,Task可能已经完成了
cts.Cancel();
try
{
//Result属性内部会调用Wait
//如果任务已取消,Result会抛出一个AggregateException
Console.WriteLine("The sum is: "+t.Result);//一个Int32值
}catch(AggregateException x){
//将任何OperationCanceledException对象都视为已处理
//其他任何异常都造成抛出一个新的AggregateException
//其中只包含未处理的异常
x.Handle(e=>e is OperationCanceledException);
//所有异常都处理好之后,执行下面这一行
Console.WriteLine("Sum was canceled");
}
Console.ReadLine();
}
private static Int32 Sum(CancellationToken ct, Int32 n)
{
Int32 sum = 0;
for (; n > 0; n--)
{
//在取消标志引用的CancellationTokenSource上调用Cancel,
//下面这行代码就会抛出OperationCanceledException
ct.ThrowIfCancellationRequested();
//如果n太大,会抛出System.OverflowException
checked { sum += n; }
}
return sum;
}
}
}
运行测试