在c#中取消多个任务的正确方法是什么

我有一个按钮,可以产生4个任务。 相同的按钮更改为取消按钮,单击此按钮将取消所有4个任务。 我是否应该将相同的取消令牌传递给所有4个任务,并让它们在IsCancelRequested的相同令牌上进行轮询? 在createlinkedtokensource上阅读msdn doc后我很困惑。 这通常是怎么做的? 谢谢

更新:Task.WaitAll()等待所有任务完成执行 。 类似地,一旦共享取消令牌源设置为取消,如何知道何时取消所有任务

是的,你所说的使用一个CancellationToken是正确的。 您可以创建单个CancellationTokenSource并将其CancellationToken用于所有任务。 您的任务应定期检查令牌以取消。

例如:

 const int NUM_TASKS = 4; CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken ct = cts.Token; Task[] tasks = new Task[NUM_TASKS]; for (int i = 0; i < NUM_TASKS; i++) { tasks[i] = Task.Factory.StartNew(() => { while (true) { Thread.Sleep(1000); if (ct.IsCancellationRequested) break; } }, ct); } Task.WaitAll(tasks); 

你的按钮可以调用cts.Cancel(); 取消任务。

更新问题更新:

有几种方法可以做你要求的。 一种方法是使用ct.IsCancellationRequested检查取消而不抛出,然后允许您的任务完成。 然后,当所有任务都被取消时, Task.WaitAll(tasks)将完成。

我已更新代码以反映该更改。

是的,您应该传递相同的令牌并使用它来一次性取消所有任务,如果这是您的意图。

 const int NUM_TASKS = 4; CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken ct = cts.Token; Task[] tasks = new Task[NUM_TASKS]; for (int i = 0; i < NUM_TASKS; i++) { tasks[i] = Task.Factory.StartNew(() => { while (true) { Thread.Sleep(1000); if (ct.IsCancellationRequested) break; } }, ct); } Task.WaitAll(tasks); 

使用BackroundWorker类,设置属性WorkerSupportsCancellation ,通过调用RunWorkerAsync()启动任务并使用CancelAsync()停止它们

您不需要将代码与UI同步。