使用取消令牌仅取消一项任务

本文关键字:取消 一项 任务 令牌 | 更新日期: 2023-09-27 18:36:37

假设我们有一个生产者-消费者模式,其中包含一个生产任务和 3 个消费者任务,如下所示:

        Task[] Consumer = new Task[10];
        for (int i = 0; i < 3; i++)
        {
            Consumer[i] = Task.Run(() => DoWork(CancellationToken ct));
        }

问题是我怎么能只取消任务消费者[2]? 当发送取消令牌时,所有消费者都会停止!如果需要,我希望能够取消单个消费者。

非常感谢

使用取消令牌仅取消一项任务

如果需要单独取消所有使用者,则需要单独的取消令牌 - 因此需要单独的取消令牌源。

var consumers =
    Enumerable
        .Range(0, 10)
        .Select(_ => new CancellationTokenSource())
        .Select(cts => new { Task = Task.Run(() => DoWork(cts.Token)),
                             TokenSource = cts })
        .ToList();

这将为您提供一个List<T>,其中每个元素都是任务及其相应的CancellationTokenSource 。所以如果你想取消consumers[0].Task,你会打电话给consumers[0].TokenSource.Cancel()