默认(CancellationToken)如何具有相应的CancellationTokenSource

时间:2015-03-30 19:58:27

标签: c# .net cancellationtokensource cancellation-token

当我创建默认CancellationToken时,我可以在调试器中看到CancellationTokenCancellationTokenSource相关联的m_source存储在私有default字段中:< / p>

Not null

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

default(CancellationToken)确实有2个构造函数可以设置此字段,但它们无关紧要,因为new CancellationToken()没有调用构造函数,而{{1}}(具有完全相同的行为)并不是&#39 ; t调用一个构造函数,因为结构体不能有无参数构造函数(yet)。

1 个答案:

答案 0 :(得分:13)

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

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

输出:

null

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

null

那么,会发生什么?

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

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实例,可以不会被取消。