Task——取消任务

作者:追风剑情 发布于:2017-10-6 20:15 分类:C#

示例:用一个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;
        }
    }
}

运行测试

11111.png

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号