想搞清楚CancellationTokenSource的用法

请问 cts.IsCancellationRequested 与 cts.Token.IsCancellationRequested 的区别是什么呢

do  
{
  //...
  if (cts.IsCancellationRequested) { break; }
  if (cts.Token.IsCancellationRequested) { break; }
} while (true);

以及为什么需要在向task传递cts.token,不传递.token也能在线程内部检测到令牌被取消了

Task.Run(() =>
{
  do  
  {
    //...
    if (cts.IsCancellationRequested) { break; }
    if (cts.Token.IsCancellationRequested) { break; }
  } while (true);
}, cts.Token);

引用 皆我百晓生 小程序回复内容作答:
CancellationTokenSource(CTS)是用于取消操作的机制,它可以通知一个或多个在后台运行的任务停止执行。可以通过调用cts.Cancel()来请求任务取消。

cts.IsCancellationRequested和cts.Token.IsCancellationRequested都是用来检测取消请求的属性。当调用cts.Cancel()时,这两个属性的值都会变为true,表示取消操作已经被请求。因此,它们的作用是一样的,可以根据个人喜好选择使用其中之一。

当向Task.Run方法传递cts.Token时,对于在任务内部的代码块来说,可以直接使用cts.Token.IsCancellationRequested属性,而不需要再使用cts.IsCancellationRequested属性。这是因为cts.Token属性返回的是CancellationT token实例,其中包含一个用于检测取消请求的IsCancellationRequested属性。

通过传递cts.Token给任务,可以使任务在运行过程中能够收到取消请求,并且在任务执行完成或取消请求触发后自动停止。如果不传递cts.Token,任务无法检测到取消请求并自动停止,需要手动在任务内部使用cts.IsCancellationRequested或cts.Token.IsCancellationRequested来判断是否取消。传递cts.Token可以简化任务代码,并提高任务的可维护性和可读性。

1.没区别。控制端是cts,token是被控制端。当然无论那端都是共享状态的,你不能说控制台说放弃了,被控制端还继续把
2.至于传cts.token,我不好解释了。你能理解理解,不了理解你就当这就是硬性规定把
线程运行是并发,操作系统有10000个线程同时运行(不光你的,也包括别人的),cpu就8个(我就假设你8核把),那么他怎么运行?他就每个线程执行个几十纳秒然后切换下一个。 你那地方传递的cts.token就是交给调度器检查的,告诉调度器我放弃了,不用切换我进cpu了。
你说进线程内部,当然也可以,不过那个切换进cpu的

所以我们两个都用。 内部用token判定,假设当前你正好在cpu里,你可以里面放弃。
假设你cancel的时候,目前正好不在cpu里,那么下一轮线程调度到你头上就不必进cpu了