【发布时间】:2018-08-30 19:38:08
【问题描述】:
我需要为我的工作实现以下要求。
- 当用户启动一个新的应用程序时,一个 5 分钟的计时器开始计时。
- 如果用户在 5 分钟之前对应用程序进行了任何编辑,则计时器将被取消。
- 如果计时器运行完毕,则会向我们公司发送一封电子邮件(“创建了一个应用程序但已放弃”)。
此项目的 Web 服务器是一个 .NET MVC 项目,但除了 Home Controller 之外,所有控制器都继承自 System.Web.Http.ApiController 而不是 System.Web.Mvc.Controller。前端是 Angular 6。
启动一个 5 分钟计时器似乎很容易,该计时器将在 5 分钟后执行“电子邮件发送”方法。如果用户在计时器用完之前编辑应用程序,我就无法实现取消计时器的功能。启动应用程序和任何后续编辑的命令将作为对 API 的单独查询,因此我没有从调用到调用维护任何状态。
我目前的想法是在应用程序启动时通过 System.Timers.Timer 创建计时器,并将计时器存储在代表该特定应用程序的唯一 ID 下的 ObjectCache 中。然后,当调用编辑操作时,我可以检查缓存以查看是否存储了与正在编辑的应用程序匹配的计时器,如果是,则取消计时器。如果这样的电话在 5 分钟内没有接到,计时器将触发并发送电子邮件。
这行得通吗? (两者都能够访问定时器来取消它,如果没有取消,定时器会按预期触发?)是否有更好或更适合 .NET 的方法来实现此要求?为这个问题的模糊范围道歉;尽管我不熟悉使用计时器可能会阻碍我的搜索。
谢谢!
【问题讨论】:
-
我不会。这与在 ASP.NET 中启动线程具有相同的问题,其中 AppDomain 可以随时休眠应用程序。更不用说如果有人更改您正在使用的缓存实现,像计时器这样的复杂对象可能无法正确序列化。你最好将消息排队等待处理,或者使用 HangFire github.com/HangfireIO/Hangfire
-
@ryzngard 谢谢你的建议! HangFire 看起来可能正是我所需要的。它在企业软件中的应用是否享有盛誉?
-
很遗憾,我从未将它用于企业软件,因此您必须进行更多挖掘并确定它是否适合您的解决方案和/或生态系统。
标签: c# .net asp.net-mvc timer objectcache