【问题标题】:Can I store a System.Timers.Timer in ObjectCache for later access?我可以在 ObjectCache 中存储 System.Timers.Timer 以供以后访问吗?
【发布时间】:2018-08-30 19:38:08
【问题描述】:

我需要为我的工作实现以下要求。

  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 创建计时器,并将计时器存储在代表该特定应用程序的唯一 ID 下的 ObjectCache 中。然后,当调用编辑操作时,我可以检查缓存以查看是否存储了与正在编辑的应用程序匹配的计时器,如果是,则取消计时器。如果这样的电话在 5 分钟内没有接到,计时器将触发并发送电子邮件。

这行得通吗? (两者都能够访问定时器来取消它,如果没有取消,定时器会按预期触发?)是否有更好或更适合 .NET 的方法来实现此要求?为这个问题的模糊范围道歉;尽管我不熟悉使用计时器可能会阻碍我的搜索。

谢谢!

【问题讨论】:

  • 我不会。这与在 ASP.NET 中启动线程具有相同的问题,其中 AppDomain 可以随时休眠应用程序。更不用说如果有人更改您正在使用的缓存实现,像计时器这样的复杂对象可能无法正确序列化。你最好将消息排队等待处理,或者使用 HangFire github.com/HangfireIO/Hangfire
  • @ryzngard 谢谢你的建议! HangFire 看起来可能正是我所需要的。它在企业软件中的应用是否享有盛誉?
  • 很遗憾,我从未将它用于企业软件,因此您必须进行更多挖掘并确定它是否适合您的解决方案和/或生态系统。

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


【解决方案1】:

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

【讨论】:

  • 不幸的是该项目已经存在多年,我需要添加这个功能。
  • 对于遗留项目,首先查看可能导致“更清洁”解决方案的任何架构因素。估计实施这些更改的时间。如果有一个足够短的估计,请选择一个并从它开始。如果没有,那就选择任何可行的方法。
猜你喜欢
  • 2020-09-21
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
相关资源
最近更新 更多