CancellationToken
是一个结构体,如果我按值将其实例传递给方法,则调用者不应修改它。因此,如果我传递一个 CancellationToken
(按值),那么我调用 cts.Cancel()
,那么拥有该令牌的 copy 的方法如何通知它已被取消?难道它不应该只在通过引用传递时才起作用吗?
例如:
public static void Main()
{
var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);
cts.Cancel();
}
public void SomeCancellableOperation(CancellationToken token)
{
...
token.ThrowIfCancellationRequested();
...
}
您可以查看CancellationToken的源代码。基本思想是令牌仅存储对 CancellationTokenSource 的引用。
internal CancellationToken(CancellationTokenSource source)
{
m_source = source;
}
CancellationTokenSource 是取消时修改的内容。检查令牌是否被取消实际上只是回到源头:
public bool IsCancellationRequested
{
get
{
return m_source != null && m_source.IsCancellationRequested;
}
}
该结构体按值传递,但它包含对 WaitHandle 的引用。 WaitHandle 是全局的。