1

我有这个代码主题:取消令牌如何停止继续?

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

    // ... some operation... 
} 

// ... some operation 2... 

通知我使用return,而不是break,因为如果我停止线程的some operation 2不能执行。

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

那么,但这只是一个“返回”功能。由于tokenSource.Cancel()而不是通常的返回,C#如何知道我正在返回?

回答

3

您不应使用相同的取消标记创建延续,否则延续也将被取消,即使在执行之前也是如此。如果您始终希望执行取消操作,请使用不同的取消标记(来自不同的取消来源)创建延续,或者直接创建它,而不使用取消标记。

+0

好吧!所以:如果当前线程被执行,我只能停止检查它内部的取消标记(实际上它不会强制线程退出,换句话说:如果我没有检查,它会一直持续到结束如果继续函数没有启动,那么调用取消标记就不会(如果没有我手动检查),对吗? – markzzz 2013-04-21 12:54:29

+0

是的,这是正确的,即使是'正常'任务也不会被执行,如果取消令牌(创建它)在任务被任务调度程序处理之前被取消,你只能在你自己的任务中检查这个标记,这样你可以取消一个长时间运行的循环,等等。O和一个注释:结束一个任务并不一定意味着线程(即运行的线程)退出,即使抛出异常也是如此。 – 2013-04-21 13:09:30

1

A CancellationToken意在一次性地将取消传播到整套动作。一旦你的源码为Cancel(),其他的延续将不会被调用。