I see that CancellationToken is a struct https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=netframework-4.7.1
If I pass a struct to a new function by value, it shouldn't be modified in the caller. So if i'm passing a CancellationTokenSource (by value), then I call cts.cancel(), how does the method that has a copy of that token is notified that it has been canceled? Shouldn't it work only if we pass by reference?
For example:
public static void Main()
{
var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);
cts.cancel();
}
public void SomeCancellableOperation(CancellationToken token) {
...
token.ThrowIfCancellationRequested();
...
}
You can look at the source code for CancellationToken. The basic idea is that the token only stores a reference to a CancellationTokenSource.
internal CancellationToken(CancellationTokenSource source)
{
m_source = source;
}
The CancellationTokenSource is what is modified when it is cancelled. Checking whether the token is cancelled really just goes back to the source:
public bool IsCancellationRequested
{
get
{
return m_source != null && m_source.IsCancellationRequested;
}
}
The struct is passed by value, but it contains a reference to a WaitHandle. The WaitHandle is global.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With