我在掌握任务和取消令牌方面遇到了一些问题。我做了一个看起来像这样的程序:
Thread.Sleep()
我同时运行5个任务(虽然我不包括for
token.Cancel()
循环似乎在任务开始之前运行?)。运行程序时,没有任何任务被取消。还有什么让我烦恼的是......在拨打CancellationRequested
时我真正取消了哪项任务?如何选择杀死5项任务中的哪一项?我可以通过它的变量来定义每个任务,但我无法访问其CancellationToken
属性,因为它是用{{1}}触发的。我需要5个不同的代币吗?
答案 0 :(得分:8)
运行程序时,没有任何任务被取消。
那是因为您只是在任务的 start 处检查取消令牌。一旦它超过了第一次token.IsCancellationRequested
检查,取消令牌就什么都不做了。如果您将支票移入您的循环中,请执行以下操作:
while (sw.ElapsedMilliseconds < time)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Cancelled");
return;
}
Thread.SpinWait(1000);
}
......然后你会看到任务做出适当反应。
另外,让我烦恼的是......在致电
token.Cancel()
时,我真正取消了哪项任务?
您没有取消任务 - 您取消了取消令牌。任何观察取消令牌的任务将被取消(或完成,或采取任何行动),但任务和令牌之间没有直接关联。
当我们谈论&#34;取消任务时#34;我们的意思是&#34;取消我们认为任务正在观察的令牌&#34;。