繁体   English   中英

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

How can a default(CancellationToken) have a corresponding CancellationTokenSource

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

不是空的

我想知道如何对于结构, default关键字“将返回结构的每个成员初始化为零或取决于它们是值还是引用类型”并且CancellationTokenSource是引用类型。

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

1 个回复

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

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

输出:

null

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

空值

那么,会发生什么?

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

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

        return m_source.WaitHandle;
    }
}

总之, default(CancellationToken)new CancellationToken创建一个空结构,其中m_sourcenull但是通过查看调试器中的结构,您将使用无法取消的默认CancellationTokenSource实例填充该字段

4 用于暂停线程的模式类似于CancellationTokenSource和CancellationToken模式?

我开始使用ConcellationTokenSource和CancellationToken在框架4.0中提供的协作线程取消模式,我发现它非常有用和简单。 我的目的是为我的应用程序提供类似的优雅和简单的解决方案,但暂停线程而不是取消它们。 因为在这种情况下,请求将与监听pause命令不同 ...

6 使用CancellationToken的竞争条件,其中CancellationTokenSource仅在主线程上被取消

考虑一个Winforms应用程序,我们有一个生成一些结果的按钮。 如果用户第二次按下该按钮,则应取消第一个生成结果的请求并开始新的结果。 我们使用以下模式,但我们不确定是否有必要使用某些代码来防止竞争条件(请参阅注释掉的行)。 注意: 我们只取消主线程上的Cancell ...

9 默认参数-CancellationToken

我使用以下代码: 但是我认为这是错误的,因为如果调用方在未提供取消令牌的情况下调用SendMessage ,则代码将以与CancellationToken.None相同的默认值运行,因此它将等待而没有时间过期。 所以也许这更好: 你怎么看? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM