【问题标题】:How to stop long running request via another request如何通过另一个请求停止长时间运行的请求
【发布时间】:2019-02-27 13:13:39
【问题描述】:

我有以下情况。我有一个ASP NET 应用程序,我想回复2 路径:

  • /run - 一个长时间运行的任务
  • /abort

我会遇到client1 通过/run(启动任务)的场景,几分钟后client2 将通过/abort 并取消client1task

这可能吗?

【问题讨论】:

    标签: asp.net request cancellation


    【解决方案1】:

    这可能吗?

    是的,以一种相当幼稚的方法,您的控制器代码如下所示:

    private static CancellationTokenSource Source {get;set;}
    
    public void Run()
    {
    
      try{
         Source = new CancellationTokenSource();
         DoLongJob(Source.Token);
      }
      catch
      {
        Source = null;
      }
    }
    
    public void Abort()
    {
       if(Source!=null) Source.Cancel();
       Source = null;
    }
    

    您将沿着 DoLongJob 方法和子调用的调用链传递 CancellationToken。在代码的不同位置,您将调用 token.ThrowIfCAncellationResquested()

    当然如前所述,这是非常基本的。它一次只能与一个 Web 服务器和一个任务一起使用。

    【讨论】:

    • 问题是它不会一次只有一个任务。会有很多任务启动器和任务停止器。我需要查找长时间运行的任务并在请求通过时取消它们。基本上我会有N 客户,每个客户都可以开始一个长时间运行的任务并在任何时间点取消他们的任务。
    • @BercoviciAdrian 那么你需要修改上面的代码来处理DictionnaryCancellationTokenSource 哪个键是userId,或者是Run返回的taskId
    • 我不知道你可以暂停Task。是通过CancellationTokenSource-s Token.WaitHandle.WaitOne 吗?这不会阻止线程池中的底层运行线程并使其无法用于其他请求吗?
    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2020-08-04
    • 1970-01-01
    • 2012-09-29
    • 2017-01-25
    • 2011-01-12
    相关资源
    最近更新 更多