我有一个生成 4 个任务的按钮。同一按钮变为取消按钮,单击此按钮应取消所有 4 个任务。我是否应该将相同的取消标记传递给所有 4 个任务并让它们轮询 IsCancelRequested 的相同标记?阅读 createlinkedtokensource 上的 msdn 文档后,我感到困惑。 .这通常是如何完成的?谢谢
更新:Task.WaitAll() 等待直到所有任务完成执行。同样,一旦共享取消 token 源设置为取消,如何知道何时所有任务都已取消。
最佳答案
是的,您所说的使用单个 CancellationToken
是正确的。您可以创建单个 CancellationTokenSource
并将其 CancellationToken
用于所有任务。您的任务应定期检查 token 是否已取消。
例如:
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)
将在所有任务都被取消时完成。
我已更新代码以反射(reflect)该更改。
关于c# - 在 C# 中取消多个任务的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7450789/