2

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

我几乎决定我需要在某处保留一个静态的计时器列表,在创建计时器时添加一个引用,并在调用回调方法时删除它(并调用 Timer.Dispose())。

有没有更简单的方法?

4

3 回答 3

3

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

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

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

要排队等待稍后交付,您的 Web 方法应将项目添加到队列中。

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

于 2013-10-03T00:04:45.427 回答
1

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

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

// Execute delayed code here.
于 2013-10-03T00:01:44.837 回答
0

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

于 2013-10-03T00:20:45.903 回答