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

被折叠的 条评论
为什么被折叠?



