原因是如果它是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);
}
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); }
CancellationToken
的默认值与CancellationToken.None
进行比较,将得到true
。默认值CancellationToken
没有令牌源,并且CancellationToken.None
也返回默认值。当您比较两个值时,将发生的结果是,比较会发现没有一个值具有令牌源,并将它们视为相等。 [CancellationTokens
是值类型,唯一的GC问题可能是引用的令牌源-但默认取消令牌没有令牌源。
关于您的第二个解决方案,如果使用默认取消令牌,它将不会真正链接它们,它将忽略默认令牌(没有令牌来源,因此无法订阅其取消)。我看不到此解决方案有任何问题。