我可以在ObjectCache中存储System.Timers.Timer以便以后访问吗?

时间:2018-08-30 19:38:08

标签: c# .net asp.net-mvc timer objectcache

我需要对我的工作执行以下要求。

  1. 用户启动新应用程序时,将启动5分钟的计时器。
  2. 如果用户在5分钟之前对应用程序进行了任何编辑,则计时器将被取消。
  3. 如果计时器运行完毕,则会向我们公司发送电子邮件(“已创建应用程序但已放弃”)。

此项目的Web服务器是.NET MVC项目,尽管除Home Controller之外,所有控制器都继承自System.Web.Http.ApiController而不是System.Web.Mvc.Controller。前端是Angular 6。

启动一个5分钟的计时器似乎很容易,该计时器将在5分钟后执行“电子邮件发送”方法。如果用户在计时器用尽之前编辑应用程序,我将如何实现取消计时器的功能。启动应用程序和进行任何后续编辑的命令将作为对API的单独查询出现,因此每次调用时我都没有保持任何状态。

我当前的想法是在应用程序启动时通过System.Timers.Timer创建计时器,并将计时器存储在ObjectCache中的代表该特定应用程序的唯一ID下。然后,当调用edit动作时,我可以检查缓存以查看是否存储了与正在编辑的应用程序匹配的计时器,如果是,请取消该计时器。如果没有在5分钟之内打出这样的电话,计时器将触发并发送电子邮件。

这项工作有效吗? (两者都可以访问计时器来取消它,并且如果没有取消,则按预期触发计时器吗?)是否存在一种更好或更适合.NET的方式来实现此要求?对于这个问题含糊的范围表示歉意;尽管我不熟悉使用计时器可能会妨碍我的搜索工作,但我对Google或搜索SO都没有运气。

谢谢!

1 个答案:

答案 0 :(得分:0)

问题的根源是体系结构。您可能应该更多地考虑服务器端的设计方式以及客户端设计和服务器端设计如何相互补充。对于初学者来说,持久状态,运行某些后台任务的能力以及访问该持久状态时使用锁定功能(例如C#的lock关键字)将有助于产生更可扩展和灵活的设计。您如何设计这些功能以及客户端如何与您交互。一种方法是让API控制器写入持久状态,使用锁定来防止并发写入,然后使用后台任务监视该持久状态并在必要时触发某些操作。尝试设计,找出最适合您需求的设计。祝您申请顺利。