【问题标题】:How can a default(CancellationToken) have a corresponding CancellationTokenSourcedefault(CancellationToken) 怎么会有对应的 CancellationTokenSource
【发布时间】:2015-03-30 19:58:26
【问题描述】:

当我创建默认的CancellationToken 时,我可以在调试器中看到CancellationToken 有一个与之关联的CancellationTokenSource,它存储在私有m_source 字段中:

我想知道 default 关键字 "will return each member of the struct initialized to zero or null depending on whether they are value or reference types"CancellationTokenSource 是一个引用类型的结构。

CancellationToken 确实有 2 个构造函数来设置此字段,但它们无关紧要,因为 default(CancellationToken) 不调用构造函数,而 new CancellationToken()(具有完全相同的行为)不调用构造函数,因为结构不能有无参数构造函数 (yet)。

【问题讨论】:

    标签: c# .net cancellationtokensource cancellation-token


    【解决方案1】:

    default(CancellationToken) 确实创建了一个CancellationToken,其中m_sourcenull。您可以通过使用反射获取该私有字段的值来看到这一点:

    Console.WriteLine(typeof (CancellationToken).
        GetField("m_source", BindingFlags.NonPublic | BindingFlags.Instance).
        GetValue(default(CancellationToken)) ?? "null");
    

    输出:

    null
    

    您还可以通过仅在调试器中固定相关字段来查看:

    那么,会发生什么?

    调试器为了显示CancellationToken的内容,会一一访问其属性。当内部CancellationTokenSourcenull 时,WaitHandle 属性会在委托给其WaitHandle 属性之前创建并设置默认CancellationTokenSource

    public WaitHandle WaitHandle
    {
        get
        {
            if (m_source == null)
            {
                 m_source = CancellationTokenSource.InternalGetStaticSource(false);
            }
    
            return m_source.WaitHandle;
        }
    }
    

    总之,default(CancellationToken)new CancellationToken 创建了一个空结构,其中 m_sourcenullby looking at the struct in the debugger you are filling that field 具有无法取消的默认 CancellationTokenSource 实例。

    【讨论】:

    • .NET 的“量子-esque”多好
    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多