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

时间:2011-09-16 21:56:07

标签: c# c#-4.0 task-parallel-library task pfx

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

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

4 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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);

答案 3 :(得分:-2)

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

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