我对我正在使用的取消令牌源有疑问,如下面的代码所示:
void Process()
{
//for the sake of simplicity I am taking 1, in original implementation it is more than 1
var cancellationToken = _cancellationTokenSource.Token;
Task[] tArray = new Task[1];
tArray[0] = Task.Factory.StartNew(() =>
{
cancellationToken.ThrowIfCancellationRequested();
//do some work here
MainTaskRoutine();
}, cancellationToken);
try
{
Task.WaitAll(tArray);
}
catch (Exception ex)
{
//do error handling here
}
}
void MainTaskRoutine()
{
//for the sake of simplicity I am taking 1, in original implementation it is more than 1
//this method shows that a nested task is created
var cancellationToken = _cancellationTokenSource.Token;
Task[] tArray = new Task[1];
tArray[0] = Task.Factory.StartNew(() =>
{
cancellationToken.ThrowIfCancellationRequested();
//do some work here
}, cancellationToken);
try
{
Task.WaitAll(tArray);
}
catch (Exception ex)
{
//do error handling here
}
}
编辑:进一步阐述
最终目标是:当用户取消操作时,所有立即挂起的任务(子或孙)都应该取消。
场景: 按照上面的代码: 1.我首先检查用户是否要求取消 2.如果用户没有要求取消,则只继续执行任务(请参阅处理方法)。示例代码在这里只显示了一个任务,但实际上可以有三个或更多
假设 CPU 开始处理 Task1,而其他任务仍在任务队列中等待一些 CPU 来执行它们。用户请求取消:处理方法中的任务 2,3 立即取消,但任务 1 将继续工作,因为它已经在处理中。
在任务 1 中,它调用方法 MainTaskRoutine,这反过来又创建了更多任务。
在MainTaskRoutine的函数中我写过:cancellationToken.ThrowIfCancellationRequested();
所以问题是:使用 CancellationTokenSource 是否正确,因为它依赖于 Task.WaitAll()?