我正在编写一个MVC 4 Windows服务,它接收消息,分析它们并发送响应。在某些情况下,我希望将响应延迟几分钟。我理解如何使用System.Threading.Timer
在延迟后执行一个方法,但我认为当处理方法结束时,对计时器对象的任何引用都会消失,允许对计时器进行垃圾回收,对吧?
我已经决定在某个地方保留一个静态的定时器列表,在创建定时器时添加一个引用,并在调用回调方法时将其删除(并调用Timer.Dispose())。
有更简单的方法吗?
答案 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秒)找出工作是否准备好并完成。