我看到CancellationToken是一个结构 https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=netframework-4.7.1
如果我按值将结构传递给新函数,则不应在调用者中修改它。因此,如果我传递一个CancellationTokenSource(按值),那么我调用cts.cancel(),如果该令牌的 copy 的方法被通知它已被取消了?只有当我们通过参考传递时,它才能起作用吗?
例如:
public static void Main()
{
var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);
cts.cancel();
}
public void SomeCancellableOperation(CancellationToken token) {
...
token.ThrowIfCancellationRequested();
...
}
答案 0 :(得分:10)
您可以查看CancellationToken的源代码。基本思想是令牌仅存储对CancellationTokenSource的引用。
internal CancellationToken(CancellationTokenSource source)
{
m_source = source;
}
CancellationTokenSource是取消时修改的内容。检查令牌是否被取消真的只是回到源:
public bool IsCancellationRequested
{
get
{
return m_source != null && m_source.IsCancellationRequested;
}
}
答案 1 :(得分:1)
struct按值传递,但它包含对WaitHandle的引用。 WaitHandle是全球性的。