29

我有一个按钮,它产生 4 个任务。同一个按钮变为取消按钮,单击该按钮应取消所有 4 个任务。我是否应该将相同的取消令牌传递给所有 4 个任务并让它们轮询 IsCancelRequested 的相同令牌?在阅读了createlinkedtokensource上的 msdn 文档后,我感到很困惑。这通常是如何完成的?谢谢你

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

4

3 回答 3

31

是的,你所说的使用单人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)将在所有任务都取消后完成。

我已经更新了代码以反映这种变化。

于 2011-09-16T22:03:10.863 回答
2

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

于 2011-09-16T22:01:38.493 回答
-2

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

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

于 2011-09-16T22:04:39.047 回答