延迟后执行一个方法?

时间:2013-10-02 23:51:22

标签: c# asp.net-mvc-4

我正在编写一个MVC 4 Windows服务,它接收消息,分析它们并发送响应。在某些情况下,我希望将响应延迟几分钟。我理解如何使用System.Threading.Timer在延迟后执行一个方法,但我认为当处理方法结束时,对计时器对象的任何引用都会消失,允许对计时器进行垃圾回收,对吧?

我已经决定在某个地方保留一个静态的定时器列表,在创建定时器时添加一个引用,并在调用回调方法时将其删除(并调用Timer.Dispose())。

有更简单的方法吗?

3 个答案:

答案 0 :(得分:3)

首先,您应该阅读Phil Haack的文章The Dangers of Implementing Recurring Background Tasks In ASP.NET

然后假设您确实想要这样做,让Web应用程序在global.asax方法Application_Start()中启动计时器,以便它将按您想要的频率触发。该计时器应该是应用程序本身的静态属性,并且被调用的事件处理程序同样应该是应用程序的静态方法。

您还需要一个需要处理的项目的优先级队列,其中每个项目的时间戳为其到期日期/时间,优先级为到期日期/时间。不要忘记同步对队列的访问。

要将某些内容排队等待以后发送,您的Web方法应该将一个项目添加到队列中。

每次事件处理程序触发时,都会查看队列的头部以查找需要处理的项目。如果找到一个,它将删除它,处理它并重复直到它的窗口已经过期,队列为空或队列的头部尚未到期。

答案 1 :(得分:1)

您可以使用Thread.Sleep()方法。

// Wait 5 seconds ...
Thread.Sleep(5000);

// Execute delayed code here.

答案 2 :(得分:0)

正确的解决方案是在服务器发送响应时让您的客户端等待几分钟。从技术上讲,它可能会在客户端触发超时,让调用成为异步,并执行您在服务器端所做的事情,并有一个标志让客户端知道它已完成,客户端可以定期轮询您的服务(可能每隔30秒)找出工作是否准备好并完成。