If CancellationToken is a struct and is passed by Value, how is it updated?

ぐ巨炮叔叔 提交于 2019-12-10 03:28:47

问题


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();
...
}

回答1:


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;
    }
}



回答2:


The struct is passed by value, but it contains a reference to a WaitHandle. The WaitHandle is global.



来源:https://stackoverflow.com/questions/48135226/if-cancellationtoken-is-a-struct-and-is-passed-by-value-how-is-it-updated

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!