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

C# 在c中取消多个任务的正确方法是什么#,c#,c#-4.0,task-parallel-library,task,pfx,C#,C# 4.0,Task Parallel Library,Task,Pfx,我有一个按钮可以产生4个任务。同一按钮更改为“取消”按钮,单击此按钮应取消所有4项任务。我是否应该将相同的cancel令牌传递给所有4个任务,并让它们在IsCancelRequested的相同令牌上进行轮询?我在上读了msdn文档后感到困惑。这通常是如何做到的?多谢各位 更新:Task.WaitAll()等待所有任务完成执行。类似地,一旦共享取消令牌源设置为cancel,如何知道所有任务何时被取消。是的,如果这是您的意图,您应该传递相同的令牌并使用它一次性取消所有任务。是的,您所说的使用单个取消

我有一个按钮可以产生4个任务。同一按钮更改为“取消”按钮,单击此按钮应取消所有4项任务。我是否应该将相同的cancel令牌传递给所有4个任务,并让它们在IsCancelRequested的相同令牌上进行轮询?我在上读了msdn文档后感到困惑。这通常是如何做到的?多谢各位


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

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

是的,您所说的使用单个
取消令牌是正确的。您可以创建一个
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);
const int NUM_TASKS=4;
CancellationTokenSource cts=新的CancellationTokenSource();
取消令牌ct=cts.Token;
Task[]tasks=新任务[NUM_tasks];
对于(int i=0;i
{
while(true)
{
睡眠(1000);
如果(ct.IsCancellationRequested)
打破
}
},ct);
}
Task.WaitAll(任务);
您的按钮可以调用
cts.Cancel()
取消任务

问题更新的更新:

有几种方法可以满足你的要求。一种方法是使用
ct.IsCancellationRequested
检查取消而不抛出,然后让您的任务完成。然后
Task.WaitAll(tasks)
将在所有任务取消后完成

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

使用类,设置属性WorkersSupportsScanCellation,通过调用RunWorkerAsync()启动任务,并使用CancelAsync()停止任务。


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

这将阻止UI最多4秒钟。这是一个等待所有任务的示例,每个任务将每秒检查一次完成情况。它不是在GUI应用程序的完整上下文中给出的。我同意@Matt的回答。但是我想指出,
var task=task.WhenAll(tasks)堆更易于管理
WaitAll()
将引发异常,如果任何任务出现故障或被取消,则会引发丑陋的
AggregateException
。请在上查看此方法的定义行为。在绝大多数情况下,这种行为意味着您只需检查返回的任务(从
WhenAll()
)status@Matt,谢谢你的解决方案。上面的代码我已经尝试了5个或更多的任务,但它不工作。你能告诉我我可以打电话给cts.Cancel()吗;任务之前。等待。我更新了我的答案以反映您的更新。