如果CancellationToken是一个结构体并且是按值传递的,那么它是如何更新的?

问题描述 投票:0回答:2

鉴于

CancellationToken
是一个结构体,如果我按值将其实例传递给方法,则调用者不应修改它。因此,如果我传递一个
CancellationToken
(按值),那么我调用
cts.Cancel()
,那么拥有该令牌的 copy 的方法如何通知它已被取消?难道它不应该只在通过引用传递时才起作用吗?

例如:

public static void Main()
{
    var cts = new CancellationTokenSource();
    SomeCancellableOperation(cts.Token);
    cts.Cancel();
}

public void SomeCancellableOperation(CancellationToken token) 
{
    ...
    token.ThrowIfCancellationRequested();
    ...
}
c# parameter-passing
2个回答
24
投票

您可以查看CancellationToken的源代码。基本思想是令牌仅存储对 CancellationTokenSource 的引用。

internal CancellationToken(CancellationTokenSource source)
{
    m_source = source;
}

CancellationTokenSource 是取消时修改的内容。检查令牌是否被取消实际上只是回到源头:

public bool IsCancellationRequested 
{
    get
    {
        return m_source != null && m_source.IsCancellationRequested;
    }
}

2
投票

该结构体按值传递,但它包含对 WaitHandle 的引用。 WaitHandle 是全局的。

© www.soinside.com 2019 - 2024. All rights reserved.