CancellationTokenSource与Task循环退出的退出标志之间的区别

Tea*_*mol 10 .net c# task exit cancellationtokensource

我想知道结束循环任务与CancellationTokenSource和退出标志之间是否有任何区别

CancellationTokenSource:

CancellationTokenSource cancellationTokenSource;
Task loopTask;

void StartLoop()
{
    cancellationTokenSource = new CancellationTokenSource();
    loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning);
}

void Loop()
{
    while (true)
    {
        if (cancellationTokenSource.IsCancellationRequested)
            break;

        Thread.Yield();
    }
}

void StopLoop()
{
    cancellationTokenSource.Cancel();

    loopTask = null;
    cancellationTokenSource = null;
}
Run Code Online (Sandbox Code Playgroud)

退出标志:

volatile bool exitLoop;
Task loopTask;

void StartLoop()
{
    exitLoop = false;
    loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning);
}

void Loop()
{
    while (true)
    {
        if (exitLoop)
            break;

        Thread.Yield();
    }
}

void StopLoop()
{
    exitLoop = true;

    loopTask = null;
}
Run Code Online (Sandbox Code Playgroud)

对我来说,使用CancellationTokenSource没有任何意义,顺便说一下,为什么取消令牌可以作为参数添加到任务工厂?

非常感谢您的任何答案.

最好的ragards teamol

Ser*_*rvy 11

  1. 使用a CancellationToken允许令牌处理所有必要的同步,因此您不必考虑它.
  2. Task由于其创建中使用的令牌导致的错误被标记为已取消时,它会将取消的状态设置Task为取消,而不是出现故障.如果使用布尔值(并且不抛出),则任务实际上将被成功标记为已完成,即使它实际已被取消.
  3. 与布尔值不同,它是引用类型,因此对CTS的引用可以在其他位置传递和取消(或检查).这是关键,因为这些位置不需要像使用布尔字段那样耦合在一起; 决定何时取消操作的代码,以及对取消作出反应的任何代码,都不需要彼此了解.这允许更大的模块化,抽象,更高级别的功能,而不是针对个别情况,等等.
  4. 它为代码增加了增强的语义含义.