2

我有一个应用程序,它依赖于在特定时间触发事件(电话)。我正在使用共享主机,所以我不能只设置 Windows 服务或 cron 作业。

我有一个诸如 /CheckCalls 之类的 URL,用于查询我是否在 +/- 60 秒后安排了任何呼叫,然后将其关闭。

我定期通过 bash 脚本(或通过 cron 服务)调用它。

如果,在控制器中,我在执行开始时启动了一个有延迟的新线程(例如 sleep(2000)),我可以期望它在控制器完成后 2 秒还活着,以触发它的消息吗?

这样我可以 a) 避免重复 b) 确保事情在正确的时间发生。

如下所示, Thread.Sleep() 并不是我问题的重点。我已经阅读并使用了另一种方法,但问题仍然存在:如果我在某处的付费托管环境中,我可以在可能存在 2 分钟的页面中启动一个后台线程,并期望它执行吗?

编辑:我找到了处理这个主题的这个线程,并使用 HttpRuntime.Cache 作为 hack 来实现它。

也许更有趣的是,线程中的一条评论说明了我所害怕的:如果没有其他事情发生,计时器不会让应用程序池保持活动状态。

https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

4

2 回答 2

2

使用 Thread.Sleep 是一个糟糕的设计选择,原因如下:

1)它在线程睡眠期间阻塞线程。2)它用尽了线程池中的线程,所以这个解决方案根本不能很好地扩展。3)这是一个糟糕的计时机制,因为这里有一个时间片或量子,它在操作系统甚至同一操作系统的版本之间有所不同(阅读:Windows)。

这个先前的 SO question 提供了更多关于为什么 Thread.Sleep 不好的信息:

为什么 Thread.Sleep 如此有害

于 2013-06-14T02:48:52.737 回答
1

在这里,这篇文章解释了如何处理你需要的东西:

http://asmiki.wordpress.com/2011/05/25/using-quartz-net-enterprise-scheduler-to-schedule-jobs-in-asp-net-mvc-application/

由于 AppPool 会在站点空闲一段时间后自行关闭,因此您的调度程序有时会失败。使用http://www.uptimerobot.com,它将每 5 分钟 ping 您的网络应用程序,因此这将使您的 AppPool 保持活动状态。

于 2013-06-26T20:05:06.403 回答