2012-09-07 45 views
7

以下是这种情况:在用户登录时,我启动了一个正在侦听IMAP闲置以接收邮件通知的任务,并且它通过信号器(推送通知类型)与客户端进行了实时连接。现在的问题是我如何取消这项任务?即用户取消推送通知或注销..如何通过Web请求取消异步任务?

编辑:根据我的理解,例如,如果5个用户登录到该网站有5个任务运行?所以我如何取消个人任务。

+0

你能否澄清,'任务'进程正在执行Web服务或Windows服务或其他? –

+1

hi @HarshBaid任务在mvc应用程序中运行。 – Iternity

回答

1

异步工作人员必须进行修改以支持取消

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

你也可以使用后台工作人员这是一个有点不太复杂 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync.aspx

我曾经遇到过一个问题,当你发送取消已经开始作业的外部源(数据库,应用程序),如果它不支持取消,则可能需要等到它完成。

编辑:我从来没有这样做与MVC,但发现一个好的文章'使用取消令牌'的asycn过程,需要在MVC4 CancellationToken参数。 http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4 希望它有帮助。

1

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

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

查看此post取消任务。

+0

谢谢@Mark。我曾考虑过存储令牌,但如何在不可序列化时存储它? – Iternity

+0

@Iternity您是否正在使用out-of-proc会话状态?你没有在 – VJAI

+0

这个问题中说我正在使用In-Proc会话。不知道它是如何影响的。请解释。 – Iternity

0

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