C# 如何通过web请求取消异步任务?

C# 如何通过web请求取消异步任务?,c#,asp.net-mvc,asynchronous,task-parallel-library,signalr,C#,Asp.net Mvc,Asynchronous,Task Parallel Library,Signalr,下面是一个场景:在用户登录时,我启动一个任务,该任务正在侦听IMAP idle以获取邮件通知,并且它通过信号器(一种推送通知)与客户机进行实时连接。现在的问题是如何取消此任务?i、 e.用户取消推送通知或注销 编辑:根据我的理解,例如,如果有5个用户登录到该站点,则有5个任务正在运行?那么如何取消单个任务。必须修改异步工作进程以支持取消 您还可以使用后台工作程序,它稍微简单一些 当您向已启动作业的外部源(DB、app)发送取消时,我遇到了一个问题,如果它不支持取消,您可能必须等待它完成 编辑

下面是一个场景:在用户登录时,我启动一个任务,该任务正在侦听IMAP idle以获取邮件通知,并且它通过信号器(一种推送通知)与客户机进行实时连接。现在的问题是如何取消此任务?i、 e.用户取消推送通知或注销


编辑:根据我的理解,例如,如果有5个用户登录到该站点,则有5个任务正在运行?那么如何取消单个任务。

必须修改异步工作进程以支持取消

您还可以使用后台工作程序,它稍微简单一些

当您向已启动作业的外部源(DB、app)发送取消时,我遇到了一个问题,如果它不支持取消,您可能必须等待它完成

编辑:我从来没有在MVC上做过这件事,但我发现了一篇关于“使用取消令牌”的好文章,该文章针对一个asycn进程,该进程在MVC4中采用了CancellationToken参数。
希望有帮助。

无论何时创建任务,都必须创建取消令牌并传递给它。由于每个用户都与一个任务相关联,因此可以将任务和取消令牌存储在用户的会话中

现在,使用存储在用户会话中的取消令牌,您可以在用户注销时轻松取消任务或按下取消按钮


有关任务取消的信息,请参见此信息。

进程可以在用户不进行任何活动的情况下自杀。 在另一个线程中交换变量的最简单方法是文件。
假设客户端浏览器仍然打开,javascript计时器调用Ajax请求,将时间戳写入服务器上的文件。您的任务也会定期读取文件,当时间戳太旧时,进程就会自杀。您可以选择设置的活动超时值。

请澄清
任务
进程是在Web服务或Windows服务中执行的,还是在其他程序中执行的?hi@HarshBaid Task正在mvc应用程序中运行。谢谢@Mark。我确实考虑过存储令牌,但是当它不可序列化时,我如何存储它?@Iternity您使用的是进程外会话状态吗?在我在Proc会话中使用的问题中,你没有这样说。不知道这有什么不同。请解释。@Iternity您是否尝试在会话中存储取消令牌?我刚刚尝试成功。@Iternity当您使用InProc会话(默认)时,您可以在会话中存储任何不需要序列化的项,但如果您使用诸如SQL server之类的进程外选项,则这将是一个问题