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

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

我有一个生成 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/

相关文章:

c# - 如何使用Emugu CV进行图像的自适应高斯阈值处理?

git - LibGit2Sharp : Checkout Remote Branch

c# - TPL DataFlow 无法处理 ActionBlock 中的异常

task-parallel-library - TPL数据流操作 block 可以在故障后重置吗?

c# - 是否有可能在C#WPF应用程序中全局捕获意外错误-C#4.0

c# - 自定义日期时间格式

c# - (WPF 的)窗口可以知道它是否是由 ShowDialog() 打开的吗?

c# - 如何从 NpgsqlDataReader 获取行数

c# - 按值复制带有 int List <int, List<int>> 的字典

c# - 使用线程处理队列的最有效方法