当前位置: 首页 > 知识库问答 >
问题:

如何保证取消代币是最新的?

丁星火
2023-03-14

Microsoft给出了这个在. NET 4中使用CinstationToken的示例。

using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
    static void Main()
    {

        var tokenSource2 = new CancellationTokenSource();
        CancellationToken ct = tokenSource2.Token;

        var task = Task.Factory.StartNew(() =>
        {

            // Were we already canceled?
            ct.ThrowIfCancellationRequested();

            bool moreToDo = true;
            while (moreToDo)
            {
                // Poll on this property if you have to do
                // other cleanup before throwing.
                if (ct.IsCancellationRequested)
                {
                    // Clean up here, then...
                    ct.ThrowIfCancellationRequested();
                }

            }
        }, tokenSource2.Token); // Pass same token to StartNew.

        tokenSource2.Cancel();

        // Just continue on this thread, or Wait/WaitAll with try-catch:
        try
        {
            task.Wait();
        }
        catch (AggregateException e)
        {
            foreach (var v in e.InnerExceptions)
                Console.WriteLine(e.Message + " " + v.Message);
        }

        Console.ReadKey();
    }
}

但是,我的理解是,如果在一个线程上修改了一个变量,由于缓存,另一个线程可能无法获得修改后的值。并且由于CensationToken在主线程上被取消,任务线程如何确保它正在检查的CensationToken实际上是最新的?

为什么任务不可能读取令牌的缓存值?

注意:我问这个问题的动机是想知道我是否需要将实例变量设置为volatile。

共有1个答案

谢学名
2023-03-14

这在内部由CancellationTokenSource处理。用于跟踪CTS状态的私有变量标记为volatile,这可以防止内部状态检查过时。

我问这个问题的动机是想知道我是否需要我的CancellationToken实例变量是可变的。

您不需要这样做,因为检查是在内部处理的,并且已经为您正确处理了。

基本上,当您从C撤消TokenSource创建C撤消Token时,该令牌包含对原始源的引用。此引用永远不会更改,因此调用ThrowIfCannah ationRequest在内部检查源的状态。由于源状态本身是易失性,因此它永远不会是“陈旧”数据。

 类似资料:
  • 问题内容: CSS教程中通常解释的方法是: 添加边框 添加填充 当您处理带有背景图像和固定填充的像素完美布局时,所有这些副作用都会变得很明显。 有什么方法可以简单地禁用折叠而不用将多余的像素推入布局中吗?对于我来说,必须以视觉方式影响文档以更改这种行为对我来说没有任何意义。 问题答案: 好吧,您需要在两者之间有一些东西来“破坏”崩溃。 我的第一个想法是使用div并在两者之间进行设置,但这似乎不起作

  • 面试题 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 面试官心理分析 其实这是很常见的一个问题,这俩问题基本可以连起来问。既然是消费消息,那肯定要考虑会不会重复消费?能不能避免重复消费?或者重复消费了也别造成系统异常可以吗?这个是 MQ 领域的基本问题,其实本质上还是问你使用消息队列如何保证幂等性,这个是你架构里要考虑的一个问题。 面试题剖析 回答这个问题,首先你别听到重复消息这个

  • 每次在特定通道中发送消息时,我都想将其打印到控制台(console.log)。我还打算用给它上色。我到处去,甚至在堆栈溢出,但我似乎找不到任何信息。我正在编写一个学术保龄球帮助机器人。下面是我尝试过的代码(我在Stack Overflow上找到了这个。) (请注意,当我说时,我指的是频道的实际id。) 我得到的错误是不是一个东西。 如何修复此错误,以及如何在discord.js?中获取最新消息 编

  • 问题内容: 中国货币的ISO 4217代码为CNY。由于限制了使用该货币进行的全球自由交易,因此存在第二种“离岸”等价货币,称为CNH。维基百科对此有一些总结。 CNH不在ISO 4217中,但我希望能够在我的应用程序中使用它,而不必编写自己的Currency类。大概在JVM安装目录中有某种列表。如何添加其他货币代码? 问题答案: 似乎Java 7已添加对此功能的支持。 对于较早的版本,您可以使用

  • 面试题 如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。 面试题剖析 我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -

  • 本文向大家介绍kafka如何保证不丢失消息?相关面试题,主要包含被问及kafka如何保证不丢失消息?时的应答技巧和注意事项,需要的朋友参考一下 复制因子:创建topic的时候指定复制因子大于1时,一个分区被分配到一个broker上,同时会在其他broker上维护一个分区副本; isr列表:分区及其副本分别为leader和follower,leader对外提供读写服务,follower会向leade