【发布时间】:2019-02-27 13:13:39
【问题描述】:
我有以下情况。我有一个ASP NET 应用程序,我想回复2 路径:
-
/run- 一个长时间运行的任务 /abort
我会遇到client1 通过/run(启动任务)的场景,几分钟后client2 将通过/abort 并取消client1 的task。
这可能吗?
【问题讨论】:
标签: asp.net request cancellation
我有以下情况。我有一个ASP NET 应用程序,我想回复2 路径:
/run - 一个长时间运行的任务 /abort我会遇到client1 通过/run(启动任务)的场景,几分钟后client2 将通过/abort 并取消client1 的task。
这可能吗?
【问题讨论】:
标签: asp.net request cancellation
这可能吗?
是的,以一种相当幼稚的方法,您的控制器代码如下所示:
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 客户,每个客户都可以开始一个长时间运行的任务并在任何时间点取消他们的任务。
Dictionnary 的CancellationTokenSource 哪个键是userId,或者是Run返回的taskId
Task。是通过CancellationTokenSource-s Token.WaitHandle.WaitOne 吗?这不会阻止线程池中的底层运行线程并使其无法用于其他请求吗?