1

有沒有辦法將取消標記綁定到由另一個取消標記控制的任務的子集?在本例中,我創建了兩個cancellationTokenSource .. 。註冊一個對另一個的取消功能...這種方式,如果我取消加載的圖像...它只取消這些任務...但如果我取消所有...它取消所有任務...是有更好的方法來做到這一點? (這種方式似乎很混亂......例如何時取消註冊)CancellationToken影響由另一個CancellationToken控制的任務的子集的好方法

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) 

回答

2

是的,有。

您可以使用CreateLinkedTokenSource *它創建了一個CancellationTokenSource可以取消自己,但是當令牌信號也會被自動取消:

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

創建一個CancellationTokenSource,這將是在取消狀態時指定數組中的任何源令牌都處於取消狀態。

CancellationTokenSource.CreateLinkedTokenSource


*如果你看看implementation它是不一樣的,但它是非常接近使用CancellationToken.Register因爲你正在做的

相關問題