如何通过Web请求取消异步任务?

时间:2012-09-07 21:51:24

标签: c# asp.net-mvc asynchronous task-parallel-library signalr

以下是该场景:在用户登录时,我启动了一个正在侦听IMAP空闲以获取邮件通知的任务,并且它通过signalr与客户端实时连接(推送通知的种类)。现在问题是如何取消此任务?即用户取消推送通知或注销..

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

3 个答案:

答案 0 :(得分:1)

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

http://www.csharp-examples.net/cancel-asynchronous-method/

您也可以使用稍微复杂一点的后台工作程序 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync.aspx

当您向已经开始作业的外部源(DB,app)发送取消时遇到的问题,如果它不支持取消,您可能需要等到它完成。

编辑:我从来没有在MVC上做过这件事,但在'使用取消令牌'上发现了一篇很好的文章。对于在MVC4中采用CancellationToken参数的asycn进程。 http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4 希望它有所帮助。

答案 1 :(得分:1)

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

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

请参阅此post以取消任务。

答案 2 :(得分:0)

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