我可以使用cancellationToken == CancellationToken.None来检查默认值(CancellationToken)

时间:2015-05-30 02:27:11

标签: c#

原因是如果它是CancellationToken.None,我需要添加一个超时(所以来自CancellationTokenSource的新的CancellationToken),例如

if (cancellationToken == CancellationToken.None)
{
    var tokenSource = new CancellationTokenSource();
    tokenSource.CancelAfter((int)_timeout.TotalMilliseconds);

    cancellationToken = tokenSource.Token;
}

另一个想法是创建一个组合令牌。

更新。这样的工作有用吗?我应该注意哪些问题? GC会做它需要的吗?

public async Task<int> InternalActionAsync(CancellationToken token)
{
    // do something with the token...
    return 1;
}

public Task<int> ExternalActionAsync(CancellationToken token = default(CancellationToken))
{
    var internalTokenSource = 
            new CancellationTokenSource((int)_timeout.TotalMilliseconds);
    var linkedTokenSource = 
            CancellationTokenSource.CreateLinkedTokenSource(token, 
                                                            internalTokenSource.Token);

    return InternalActionAsync(linkedTokenSource.Token);
}

2 个答案:

答案 0 :(得分:3)

首先,查看source code

public static CancellationToken None
{
    get { return default(CancellationToken); }
}

所以你可以安全地假设他们是平等的。

但是,如果用户没有CancellationToken传递,也许您可​​以请求CancellationToken?而不是依赖于令牌之间的默认相等:

public Task<int> ExternalActionAsync(CancellationToken? token = null)
{
    if (token == null)
    {
        var tokenSource = new CancellationTokenSource();
        tokenSource.CancelAfter((int)_timeout.TotalMilliseconds);
        token = tokenSource.Token;
    }

    return InternalActionAsync(token);
}

答案 1 :(得分:0)

您可以将CancellationToken的默认值与CancellationToken.None进行比较,结果为“true”。默认的CancellationToken没有令牌源,CancellationToken.None也返回默认值。比较这两个值时,会发生的比较是,比较看到没有任何值具有令牌源,并将它们视为相等。

CancellationTokens是值类型,唯一的GC问题可能是引用的令牌源 - 但默认取消令牌没有令牌源。

关于你的第二个解决方案,在默认取消令牌的情况下,它不会真正链接它们,它将忽略默认令牌(没有令牌源,因此它不能订阅它的取消)。我看不出这个解决方案有任何问题。