1

キャンセル トークンを別のキャンセル トークンによって制御されるタスクのサブセットに関連付ける方法はありますか?...この例では、2 つの cancelTokenSource を作成し、1 つを他の 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)
4

1 に答える 1

2

はいあります。

CreateLinkedTokenSource* を使用するCancellationTokenSourceと、自分でキャンセルできますが、トークンが通知されると自動的にキャンセルされます。

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

指定された配列内のソース トークンのいずれかがキャンセルされた状態にある場合に、キャンセルされた状態になる CancellationTokenSource を作成します。

CancellationTokenSource.CreateLinkedTokenSourceから


*実装を見ると、同じではありませんが、使用しているのとかなり近いCancellationToken.Registerです。

于 2014-09-21T00:46:31.357 に答える