0

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

  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 的方法来实现此要求?为这个问题的模糊范围道歉;尽管我不熟悉使用计时器可能会阻碍我的搜索,但我在 Google 或搜索 SO 方面没有运气。

谢谢!

4

1 回答 1

0

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

于 2018-08-30T20:08:44.273 回答