c# - 我可以使用 cancellationToken == CancellationToken.None 来检查 default(CancellationToken)

标签 c#

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

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

    cancellationToken = tokenSource.Token;
}

另一个想法是创建一个组合 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);
}

最佳答案

首先,查看 source code :

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

因此您可以放心地假设它们是相等的。

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

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);
}

关于c# - 我可以使用 cancellationToken == CancellationToken.None 来检查 default(CancellationToken),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30541592/

相关文章:

c# - 为什么 .Net 的 MS 不更开放?

c# - 在 javascript/razor 应用程序中按名称获取值

c# - 当客户端脚本显示时正确调整 ModalPopupExtender 的大小

c# - 如何排除父类的属性

c# - 线程 block

c# - 将文本文件中的每一行放入数组 C#

C#使用反射复制基类属性

c# - 如果我使用 SQLite 创建 C# 桌面应用程序,数据库会与安装程序捆绑在一起吗?

c# - 如何从 PerformContext 获取 Hangfire 后台作业的总重试次数?

c# - 在 C# 中是否有与 Groovy 等效的东西?