【问题标题】:CancellationToken DesignCancellationToken 设计
【发布时间】:2022-06-17 00:23:20
【问题描述】:

我试图理解cancellationToken是一个东西的“原因”,因为我的理解让我觉得它没用。

首先来自msdnhttps://docs.microsoft.com/fr-fr/dotnet/standard/parallel-programming/task-cancellation

问题1:在“B”处传递Token有什么意义,因为我们直接在“C”处使用全局变量(在“A”处声明) 问题 2:使用“CancellationTokenSource”对象有什么意义,因为一个简单的布尔值使工作变得像这样:

if(myBoolCancelRequested){
  //...
  throw new OperationCanceledException()
}

然后,还是来自 msdn https://docs.microsoft.com/fr-fr/dotnet/standard/parallel-programming/how-to-cancel-a-task-and-its-children 看来我必须将令牌传递给所有调用层次结构,这让我很沮丧。假设我有一个像这样的现有代码(在单独的文件和单独的类中)

main()
    method1()
    |->method2()
    |  |-> method3()
    |  |   |-> DoSomeWork()

将 DomeSomeWork() 转换为可取消(如 msdn 建议)会影响所有代码:'(

我希望该框架能够提供强大的工具,例如(在 DoSomeWork 内部):

for (int i = 0; i <= maxIterations; i++)
{
   // Do a bit of work. Not too much.
   ....
   ...

   if(Thread.AmazingCurrent?.AmazingCancellationToken?.IsCancellationRequested)
   {
      Console.WriteLine("Task {0} cancelled", taskNum);
      //----> **Decide if it's needed to throw exception or just break the loop**
   }

问题 3:对 CancellationToken 机制背后的设计有何看法?

【问题讨论】:

  • 请将帖子限制为每个帖子一个目标问题。

标签: c# cancellationtokensource


猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2013-09-21
  • 2016-04-04
相关资源
最近更新 更多