原因是如果它是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/