原因是如果它是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);
}
答案 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问题可能是引用的令牌源 - 但默认取消令牌没有令牌源。
关于你的第二个解决方案,在默认取消令牌的情况下,它不会真正链接它们,它将忽略默认令牌(没有令牌源,因此它不能订阅它的取消)。我看不出这个解决方案有任何问题。