c# - 任务循环退出的 CancellationTokenSource 和退出标志之间的区别

标签 c# .net 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;
}

退出标志:

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;
}

对我来说,使用 CancellationTokenSource 没有任何意义,顺便说一句,是否有任何理由可以将取消 token 作为参数添加到任务工厂?

非常感谢您的任何回答。

最好的 ragards teamol

最佳答案

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

关于c# - 任务循环退出的 CancellationTokenSource 和退出标志之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47959965/

相关文章:

c# - TaskFactory,结束时开始一个新任务

c# - 尽管连接字符串超时 3 秒,但 SQL 连接等待 15 秒

c# - ThreadPool 或 Task 是否适合用于服务器?

.net - 发布生成 .pdb 文件,为什么?

api - 如何使用curl在Salesforce中创建任务?

amazon-web-services - AWS ECS 服务类型守护程序与约束之间的差异 "One Task Per Host"

c# - 如何在 .net 4.5 中针对 AzureAD 实现 SAML2 身份验证? (消费代币)

c# - 什么是创建可等待函数的正确方法

c# - response.writefile 后页面处理停止

.net - 我应该引用哪个 Microsoft Word(和 Excel)互操作程序集或 DLL?