C-sharp collaboration try to cancel thread

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace 
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine( "" );
            CancellationTokenSource cts = new CancellationTokenSource(  );
            //ThreadPool.QueueUserWorkItem(CallBack, cts.Token );
            ThreadPool.QueueUserWorkItem(CallBack, cts);
            Console.WriteLine(  "" );
            Console.Read(  );
            cts.Cancel();
            Console.ReadKey();
        }

        public static void CallBack( object state )
        {
            CancellationTokenSource cts = (CancellationTokenSource)state;
            Console.WriteLine( "" );
            Count( cts, 5 );
        }
        private static void Count(CancellationTokenSource cts, int countto )
        {
            for( int i=0; i<=countto+10; PPi) {
                if( i== countto) {
                    cts.Cancel();
                    Console.WriteLine( "" );
                    //return;
                }
                Console.WriteLine( ":{0}, ID: {1}", i, Thread.CurrentThread.ManagedThreadId );
                Thread.Sleep(300);
            }
            Console.WriteLine("");
        }
    }
}

clipboard.png

it is obvious that the Count () function is still executing after calling cts.Cancel (). It is said in the book that CancellationTokenSource is a helper cancel thread. I just learned multithreading, and I don"t understand.
We put some tasks (functions) to be executed in a thread. If the task terminates, does it mean that the thread cancels
if the above code is changed to:

if( i== countto) {
    cts.Cancel();
    Console.WriteLine( "" );
    return;
}

does this allow you to cancel the thread correctly.

Feb.03,2022

in the Count method, you need to use cts.IsCancellationRequested to determine whether the current thread has been cancelled.

if (cts.IsCancellationRequested)
{
    Console.WriteLine( "" );
    return;
}
Menu