这个article讨论了在分离的和附加的子任务之间传播TaskCanceledException
的不同行为。但我自己尝试过,似乎两种情况都不会传播TaskCanceledException
:
class Program
{
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
var ct = cts.Token;
var task = Task.Factory.StartNew(() =>
{
var child1 = Task.Factory.StartNew(() =>
{
while (true)
{
ct.ThrowIfCancellationRequested();
Console.WriteLine("Ta!");
Thread.Sleep(1000);
}
}, ct, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);
var child2 = Task.Factory.StartNew(() =>
{
while (true)
{
ct.ThrowIfCancellationRequested();
Console.WriteLine("Da!");
Thread.Sleep(1000);
}
}, ct, TaskCreationOptions.None, TaskScheduler.Default);
}, ct);
Console.ReadKey();
cts.Cancel();
Console.ReadKey();
try
{
task.Wait();
}
catch (AggregateException ae)
{
foreach (var e in ae.Flatten().InnerExceptions)
{
Console.WriteLine(e);
}
}
Console.ReadKey();
}
}
在上面的代码中,最后没有抛出AggregationException
。而且,TaskCanceledException
也不会传播到UnobservedTaskException
事件。
因此,我想知道,如果关于取消的附加和分离子任务之间有什么区别吗?
谢谢!