c#异步任务取消

时间:2016-10-28 12:59:24

标签: c# multithreading asynchronous task cancellationtokensource

我在掌握任务和取消令牌方面遇到了一些问题。我做了一个看起来像这样的程序:

Thread.Sleep()

我同时运行5个任务(虽然我不包括for token.Cancel()循环似乎在任务开始之前运行?)。运行程序时,没有任何任务被取消。还有什么让我烦恼的是......在拨打CancellationRequested时我真正取消了哪项任务?如何选择杀死5项任务中的哪一项?我可以通过它的变量来定义每个任务,但我无法访问其CancellationToken属性,因为它是用{{1}}触发的。我需要5个不同的代币吗?

1 个答案:

答案 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;。