我可以使用cancellationToken == CancellationToken。无以检查默认值(CancellationToken)

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

原因是如果它是CancellationToken.None,我需要添加一个超时时间(例如,从CancellationToken开始新的CancellationTokenSource

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

    cancellationToken = tokenSource.Token;
}

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

Update。这样可以吗?我应该注意什么问题? 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);
}
c#
2个回答
4
投票
首先,查看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); }


0
投票
您可以将CancellationToken的默认值与CancellationToken.None进行比较,将得到true。默认值CancellationToken没有令牌源,并且CancellationToken.None也返回默认值。当您比较两个值时,将发生的结果是,比较会发现没有一个值具有令牌源,并将它们视为相等。

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

关于您的第二个解决方案,如果使用默认取消令牌,它将不会真正链接它们,它将忽略默认令牌(没有令牌来源,因此无法订阅其取消)。我看不到此解决方案有任何问题。

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