使用CancellationToken仅取消一项任务

时间:2016-02-26 23:24:35

标签: c# task producer-consumer

让我们假设我们有一个使用One Producing Task和3个Consumer Tasks创建的Producer-Consumer模式,如下所示:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("audio/*");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(song.filename));
startActivity(Intent.createChooser(intent, "Share Song File:"));

问题是如何才能取消任务消费者[2]?所有消费者停止发送取消时!我希望能够在需要时取消单个消费者。

非常感谢

1 个答案:

答案 0 :(得分:4)

如果您需要独立取消所有消费者,则需要单独的取消令牌 - 因此需要单独取消令牌来源。

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