第26章 计算限制的异步操作(6)

本文探讨了C#中Task对象的ContinueWith方法的应用,包括如何根据不同的完成情况触发后续任务,如仅在任务成功完成、取消或出现异常时执行特定操作。

26.5.3 一个任务完成时自动启动一个新任务

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadStudy
{
    class Program
    {
        static void Main(string[] args)
        {
            Task<int> t1 = new Task<int>(n => Sum(100),100000000);
            t1.Start();
            Task t2 = t1.ContinueWith(task => Console.WriteLine("The sum is "+t1.Result));
            t2.Wait();
        }

        static int Sum(int num)
        {
            Thread.Sleep(100);

            if (num == 0)
                return 0;
            else
                return num + Sum(num - 1);
        }
    }
}
Task对象内部包含了ContinueWith任务的一个集合,所以,实际上可以用一个Task对象多次调用ContinueWith。任务完成时,所有ContinueWith任务都会进入线程池的队列中。除此之外,调用ContinueWith时,可以传递一组TaskContinuationOptions枚举值进行按位OR运算的结果。前4个标志(None,PreferFairness,LongRunning和AttachedToParent)与早先描述的TaskCreationOptions枚举类型提供的标志完全一样。

调用ContinueWith时,可以指定你希望新任务只有在第一个任务被取消时才运行,这是使用TaskContinuationOptions.OnlyOnCanceled标志来实现的。类似地,可以使用TaskContinuationOptions.OnlyOnFaulted标志,指定新任务只有在第一个任务抛出一个未处理的异常时才运行。当然,还可以使用TaskContinuationOptions.OnlyOnRanToCompletion标志,指定只有当第一个任务顺利结束(中途没有取消,也没有抛出未处理异常)时才运行新任务。默认情况下,如果没有指定上述任何标志,新任务无论如何都会运行,不管第一个任务是如何完成的。一个Task完成时,它的所有尚未运行的延续任务都会自动取消。

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadStudy
{
    class Program
    {
        static void Main(string[] args)
        {
            Task<int> t1 = new Task<int>(n => Sum(100),100000000);
            t1.Start();
            t1.ContinueWith(task => Console.WriteLine("The sum is "+t1.Result),TaskContinuationOptions.OnlyOnRanToCompletion);
            t1.ContinueWith(task => Console.WriteLine("Threw " + t1.Exception), TaskContinuationOptions.OnlyOnFaulted);
            t1.ContinueWith(task => Console.WriteLine("Sum was canceled"), TaskContinuationOptions.OnlyOnCanceled);
            Thread.Sleep(1000);
        }

        static int Sum(int num)
        {
            if (num == 0)
                return 0;
            else
                return num + Sum(num - 1);
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值