我有一个应用程序,它依赖于在特定时间触发事件(电话)。我正在使用共享主机,因此我不能只设置 Windows 服务或 cron 作业。
我有一个 URL(例如/CheckCalls),用于查询从现在开始 +/- 60 秒内是否安排了任何通话,然后将其关闭。
我定期通过 bash 脚本(或通过 cron 服务)调用它。
如果在 Controller 中,我在执行开始时启动一个有延迟的新线程(例如 sleep(2000)),我是否可以期望它在 Controller 完成后 2 秒仍处于事件状态,以触发其消息?
这样我就可以 a) 避免重复,b) 确保事情在正确的时间进行。
如下所示,Thread.Sleep() 并不是我问题的真正焦点。我已经阅读并使用了替代方法,但问题仍然存在:如果我在某个地方的付费托管环境中,我可以在页面中启动一个可能存在 2 分钟的后台线程,并期望它执行吗?
编辑:我发现这个线程处理这个主题,并使用 HttpRuntime.Cache 作为实现这个的黑客。
也许更有趣的是,线程中的一条评论说明了我所担心的事情:如果没有其他事情发生,计时器将不会使应用程序池保持事件状态。
https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
最佳答案
使用 Thread.Sleep 是一个糟糕的设计选择,原因如下:
1) 它在线程休眠期间阻塞线程。 2)它耗尽了线程池中的线程,因此该解决方案根本无法很好地扩展。 3) 这是一个糟糕的计时机制,因为这里存在一个时间片或量子,它在操作系统之间甚至同一操作系统的版本之间有所不同(例如:Windows)。
上一个 SO 问题提供了有关 Thread.Sleep 为何不好的更多信息:
关于asp.net-mvc - ASP.NET——启动一个线程在未来几分钟内工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099997/