我想在MVC网站中创建一个相对简单的定时事件调度功能来实现应用程序功能,当前不一定是用户,但将来可能会。我当前的愿望是使用时间表根据定时事件对网站进行特定更改。总体思路如下所示。
我首先对asp.net的Quartz进行了研究,因为在其他帖子中推荐使用它,但是该开源软件包中的建议特别建议不要在嵌入式模式下使用它。我认为我不能将其作为服务添加到托管MVC站点的服务器中。
尽管我熟悉多线程的概念,但我对它没有经验。在后台线程上运行下面的Timer Process是一个好的解决方案,还是我应该看看别的东西?我以为Timer Process将永远执行,将时间表与系统时钟进行比较,并在发生时间触发时使所需的事件代码运行。
如果线程处理不是一个好主意,请告知我应该看的地方。如果穿线是正确的想法,任何建议或警告将不胜感激。我目前正在阅读线程。
我有几个具体问题:
1) Should the individual event code run on the same thread, or does it matter?
2) How do I handle the problem others have suggested occurs if 'IIS kills the thread' or the 'app pool is recycled'.
3) Is it a wrong idea that I send some message to the MVC site that triggers the Timer Process to overcome the issues in #2 above?
4) Is there a way to force a page to automatically refresh with a new display when the timer event occurs? That doesn't seem to be the way asp.net MVC normally works.
最后,这听起来像是一个问题,其他人可能已经解决了,并简化为asp.net MVC的开源解决方案。当我浏览Nu-Get时,似乎有一些描述了此问题,但下载量很少。这条路线上有什么建议吗?
答案 0 :(得分:1)
对于您来说,我认为使用Hangfire会很好。您可以像并行服务器一样配置,并以不同的时间表创建不同的作业。
对于NetCore应用:
app.UseHangfireServer();
app.UseHangfireDashboard("/hangfire", options);
// Process notifications every 6 hours
RecurringJob.AddOrUpdate<B2CEngineNotifications>(jobEngine => jobEngine.SendBillingNotifications(), "0 */6 * * *");
在这种情况下,每个作业都在自己的线程中工作。
1)单个事件代码应该在同一线程上运行还是很重要? 这取决于您期望的事件类型。如果不依赖它们,则可以在单独的线程中进行操作。
如果“ IIS杀死线程”或“应用程序池被回收”,我该如何处理别人建议的问题。 Hangfire将在您的数据库中创建一些表。如果您要终止进程,则在下次启动时,它将从db获取所有数据并在scedule上开始执行事件。
我是否向MVC网站发送了一些消息,触发了计时器进程以克服上面#2中的问题,这是一个错误的主意吗? Hangfire有自己的界面来管理工作。或者您需要选择从MVC应用启动事件?您可以从MVC做到这一点,只需更改db值即可。 hangfire将开始工作。
有没有一种方法可以在发生计时器事件时强制页面以新的显示自动刷新?这似乎不是asp.net MVC正常工作的方式。 在这种情况下,您需要使用AJAX与服务器建立“实时”连接,而“询问”是否已更改。