【问题标题】:how cancellation token stop continue with?如何取消令牌停止继续?
【发布时间】:2013-04-21 09:57:41
【问题描述】:

我有一个包含此代码的线程:

foreach (string file in allDirectoriesFiles)
{
    if (cancellationToken.IsCancellationRequested)
    {
        return;
    }

    // ... some operation...
}

// ... some operation 2...

请注意,我使用return 而不是break,因为如果我停止线程,则不能执行some operation 2。

我还注意到,以这种方式 .ContinueWith 它没有被执行。

嗯,但这只是一个“返回”功能。 C# 怎么知道我返回是因为 tokenSource.Cancel() 而不是通常的返回?

【问题讨论】:

    标签: c# winforms task cancellationtokensource cancellation-token


    【解决方案1】:

    您不应使用相同的取消标记创建延续,否则延续也会被取消,即使在执行之前也是如此。使用不同的取消令牌(来自不同的取消源)创建延续,或者如果您始终希望执行取消,则只需创建不带取消令牌的延续。

    【讨论】:

    • 好吧!所以:如果当前线程被执行,我只能停止它检查它里面的取消令牌(它实际上不会强制线程退出。换句话说:如果我不检查它会一直持续到最后那个令牌。相反,如果没有启动 continue 函数,那么如果调用取消令牌(没有我手动检查)就不会。对吗?
    • 是的,这是正确的。如果在任务调度程序处理任务之前取消了取消令牌(用于创建它),即使是“正常”任务也不会执行。您只需在自己的任务中检查令牌,以便您可以取消长时间运行的循环等。O,并且只需注意:结束任务并不一定意味着线程(运行 ot 的线程)退出,即使异常是抛出。
    【解决方案2】:

    CancellationToken 旨在一次将取消传播到整个操作集。一旦你Cancel()它的源,其他的延续将不会被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-13
      • 2018-08-22
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多