如果CancellationToken是一个结构并由Value传递,它是如何更新的?

时间:2018-01-07 07:34:07

标签: c# parameter-passing

我看到CancellationToken是一个结构 https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=netframework-4.7.1

如果我按值将结构传递给新函数,则不应在调用者中修改它。因此,如果我传递一个CancellationTokenSource(按值),那么我调用cts.cancel(),如果该令牌的 copy 的方法被通知它已被取消了?只有当我们通过参考传递时,它才能起作用吗?

例如:

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

public void SomeCancellableOperation(CancellationToken token) {
...
    token.ThrowIfCancellationRequested();
...
}

2 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:1)

struct按值传递,但它包含对WaitHandle的引用。 WaitHandle是全球性的。