CancellationToken影响由另一个CancellationToken控制的任务子集的好方法

时间:2014-09-21 00:40:25

标签: c# multithreading task cancellationtokensource cancellation-token

有没有办法将取消令牌绑定到由另一个取消令牌控制的任务子集?...在​​这个例子中,我创建了两个cancellationTokenSource的...并在另一个的Cancel函数中注册一个...这个如果我取消加载图像的方式...它只取消那些任务...但如果我取消所有...它取消所有任务...有更好的方法来做到这一点? (这种方式似乎很混乱......例如何时取消注册)

CancellationTokenSource CancelAllSource = new CancellationTokenSource();

for (int i = 0; i < 20; i++)
    Task.Factory.StartNew(() => { LoadUrl(i, CancelAllSource.Token); });

CancellationTokenSource CancelImageLoadsSource = new CancellationTokenSource();

// this would connect the cancel all token to the cancel image loads token
CancelAllSource.Token.Register(CancelImageLoadsSource.Cancel, false);

for (int i = 0; i < 10; i++)
    Task.Factory.StartNew(() => { LoadImage(i, CancelImageLoadsSource.Token); });

...

CancelImageLoadsSource.Cancel(); // would cancel only the LoadImage tasks
// or
CancelAllSource.Cancel(); // would cancel all tasks (including the LoadImage tasks)

1 个答案:

答案 0 :(得分:2)

是的,有。

您可以使用CreateLinkedTokenSource *创建CancellationTokenSource您可以自行取消,但在令牌发出信号时也会自动取消:

var cancelAllSource = new CancellationTokenSource();
var cancelImageLoadsSource = CancellationTokenSource.CreateLinkedTokenSource(cancelAllSource.Token);
  

创建一个CancellationTokenSource,当指定数组中的任何源标记处于取消状态时,它将处于取消状态。

来自CancellationTokenSource.CreateLinkedTokenSource


*如果您查看implementation它不是一样的,但它与您正在使用的CancellationToken.Register非常接近 < / p>