使用 CancellationToken 仅取消一项任务
Cancel ONLY one task with CancellationToken
假设我们有一个使用一个生产任务和三个消费者任务创建的生产者-消费者模式,如下所示:
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()
.
假设我们有一个使用一个生产任务和三个消费者任务创建的生产者-消费者模式,如下所示:
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()
.