代码之家  ›  专栏  ›  技术社区  ›  CrazyCoder

即使在传递取消令牌后,任务也不会被取消

  •  0
  • CrazyCoder  · 技术社区  · 4 年前

    我的任务如下:

    CancellationTokenSource cts = new CancellationTokenSource();
    var token = cts.Token;
    
    var task = Task.Run(() =>
    {
     do {
        Console.log("Check status");
        if (cts.IsCancellationRequested)
        {
            break;
        }
        Thread.Sleep(5*60*1000);
        status =  GetStatus();
        Console.log("status in while loop : " + status);
        if (status == "Complete")
        {
            flag = 1;
            break;
        } 
     
     } while (flag == 1)
    
      Console.log("status after while: " +  status);
      
      // some other businness logic
    
    },token);
    
    if (task.Wait(System.TimeSpan.FromMinutes(1))){
     Console.log ("Success");
    }
    else{
     Console.log ("Timed out");
     cts.Cancel();
     StopExecution();
    }
    
    
        void Stop Execution(){
         Console.log ("Stopping Execution");
         // logic to stop
         
         Console.log("Stopped Successfully");
        
        }
    

    我已经编写了上面的代码,来运行一些任务一段时间,并在指定的时间结束时取消它。
    上述代码的问题是,每当发生超时时,它都会转到else块,但它不会取消正在运行的任务。
    因此,我将借助日志显示执行流程:

    检查状态
    while循环中的状态:InProgress
    检查状态
    while循环中的状态:InProgress
    超时
    停止执行
    检查状态
    成功停止
    while之后的状态:InProgress

    我观察到,即使任务超时,它仍在执行任务。
    我的要求是,一旦时间到了,就应该结束整个任务,根本不应该执行。在这个例子中,我只展示了do while逻辑,但也有其他一些业务逻辑。
    我希望停止整个任务的执行,并继续进行。有谁能告诉我,为了实现这一目标,我做错了什么?

    0 回复  |  直到 4 年前
    推荐文章