Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在ObjectCache中存储System.Timers.Timer以供以后访问吗?_C#_.net_Asp.net Mvc_Timer_Objectcache - Fatal编程技术网

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

C# 我可以在ObjectCache中存储System.Timers.Timer以供以后访问吗?,c#,.net,asp.net-mvc,timer,objectcache,C#,.net,Asp.net Mvc,Timer,Objectcache,我需要为我的工作执行以下要求 当用户启动一个新的应用程序时,一个5分钟的计时器开始 如果用户在5分钟前对应用程序进行了任何编辑,则计时器将被取消 如果计时器运行到完成,将向我们公司发送一封电子邮件(“已创建应用程序,但已放弃”) 此项目的web服务器是.NET MVC项目,但除了主控制器之外,所有控制器都继承自System.web.Http.ApicController,而不是System.web.MVC.Controller。前端有角度6 启动一个5分钟计时器,在5分钟后执行“email se

我需要为我的工作执行以下要求

  • 当用户启动一个新的应用程序时,一个5分钟的计时器开始
  • 如果用户在5分钟前对应用程序进行了任何编辑,则计时器将被取消
  • 如果计时器运行到完成,将向我们公司发送一封电子邮件(“已创建应用程序,但已放弃”)
  • 此项目的web服务器是.NET MVC项目,但除了主控制器之外,所有控制器都继承自System.web.Http.ApicController,而不是System.web.MVC.Controller。前端有角度6

    启动一个5分钟计时器,在5分钟后执行“email send”方法似乎很容易。如果用户在计时器用完之前编辑应用程序,我就无法实现取消计时器的功能。启动应用程序的命令和任何后续编辑都将作为对API的单独查询,因此我不需要在调用之间维护任何状态

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

    这样行吗?(既可以访问计时器以取消它,也可以在未取消的情况下按预期触发计时器?)是否有更好或更适合.NET的方法来实现此要求?为这个问题的模糊范围道歉;我在谷歌或搜索方面运气不佳,尽管我不熟悉使用计时器可能会妨碍我的搜索


    谢谢大家!

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

    不幸的是,该项目已经存在多年,我需要在中添加此功能。对于遗留项目,请从查看可能导致“更清洁”解决方案的任何体系结构因素开始。估计实施这些更改的时间。如果有足够的短期估计,选择一个并开始。如果没有,那就选任何有用的。我不会。这与在ASP.NET中启动线程的问题相同,在ASP.NET中,AppDomain可以随时休眠应用程序。更不用说,如果有人更改您正在使用的缓存实现,像计时器这样的复杂对象可能无法正确序列化。你最好在某个地方排队等待处理消息,或者使用HangFire@ryzngard之类的工具谢谢你的建议!HangFire看起来正是我需要的。它在企业软件中使用是否有良好的声誉?不幸的是,我从未在企业软件中使用过它,因此您必须进行更多的挖掘,并确定它是否适合您的解决方案和/或生态系统。