Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何通过另一个请求停止长时间运行的请求_Asp.net_Request_Cancellation - Fatal编程技术网

Asp.net 如何通过另一个请求停止长时间运行的请求

Asp.net 如何通过另一个请求停止长时间运行的请求,asp.net,request,cancellation,Asp.net,Request,Cancellation,我有以下情况。我有一个ASP-NET应用程序,我想响应2路径: /run-长时间运行的任务 /abort 我会有这样一个场景,client1通过/run(启动任务),几分钟后client2将通过/abort,并取消client1的任务 这可能吗 这可能吗 是的,在一种相当幼稚的方法中,您的控制器代码如下所示: private static CancellationTokenSource Source {get;set;} public void Run() { try{ S

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

  • /run
    -长时间运行的任务
  • /abort
我会有这样一个场景,
client1
通过
/run
(启动任务),几分钟后
client2
将通过
/abort
,并取消
client1
任务

这可能吗

这可能吗

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

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
客户端,每个客户端都可以启动长时间运行的任务并随时取消他们的任务。@Bercovicadrian然后您需要修改上面的代码来处理
CancellationTokenSource
Dictionnary
,哪个键是用户ID,或者由
Run
返回的taskId,我不知道您可以暂停
任务
。这是通过
CancellationTokenSource
-s
Token.WaitHandle.WaitOne
?这是否会阻止线程池中的底层运行线程,并使其无法用于其他请求?