我有以下代码
try
{
var cancellationTokenSource = new CancellationTokenSource();
var token = cancellationTokenSource.Token;
var task = Task.Run(() =>
{
while (token.IsCancellationRequested == false)
{
Console.Write("*");
Thread.Sleep(1000);
}
}, token).ContinueWith((t) =>
{
Console.WriteLine("You have canceled the task");
}, TaskContinuationOptions.OnlyOnCanceled);
Console.WriteLine("Press enter to stop the task");
Console.ReadLine();
cancellationTokenSource.Cancel();
task.Wait();
}
catch (AggregateException e)
{
Console.WriteLine($"Got an exception => {e.InnerExceptions[0].Message}");
}
当我取消任务时,它总是抛出错误,并且没有执行继续任务。
但是当我从 continueWith 参数中删除TaskContinuationOptions.OnlyOnCanceled
时,正在执行继续任务。
我所关注的书中包含参数TaskContinuationOptions.OnlyOnCanceled
的代码。
行为是正确还是错误?
我是线程新手。请帮帮我。
答案 0 :(得分:3)
您的第一个任务实际上并未被取消 - 您正在观察已经请求取消,但是您正在让第一个任务正常完成...这意味着您的“仅取消”任务被取消。如果您将代码更改为:
while (token.IsCancellationRequested == false)
{
Console.Write("*");
Thread.Sleep(1000);
}
token.ThrowIfCancellationRequested();
...然后它会按照您的预期行事。