我在asp.net的global.as中使用了System.Timers.timer来设置一个用于调度执行a的计时器 功能 让'说transferMoney()。 但似乎这个计时器可能会在意外几个小时后停止。 这导致所有行动都悬而未决。 我想知道在asp.net,MVC 1.0中是否有更好的方法来设置计时器? 提前谢谢!
答案 0 :(得分:4)
这可能只是因为应用程序被回收了。 Global.ashx不是真正适合长时间运行任务的地方,因为如果您的AppDomain被回收,您的计时器将会死亡。我建议改为提供一个工作窗口服务。
编辑:嗯,在Visual Studio中创建Windows服务项目相当容易,只需执行[File]> [添加]> [新项目......]> [Windows]> [Windows服务],您将获得项目的存根代码。
很难想出一个完整的例子,所以我建议你google it。 ;)有大量样品可供您查看。
CodeProject上的This article似乎是Windows服务的一个很好的介绍。
答案 1 :(得分:2)
您在ASP.NET应用程序中使用的任何计时器最终都会“终止”,但由于process recycling,这是一种非常期待的行为。
答案 2 :(得分:1)
计时器将永远不会工作,因为IIS将根据应用程序池设置定期重新安排工作进程,因此当它循环使用时,您的计时器将被销毁,您可能需要重新打开它。
您可以检查计时器对象是否仍然可用,如果不可用则创建!!,使用任何其他计时器对象将无法正常工作。但是这仍然存在问题,因为如果你在特定的时间段内没有任何网络请求,它仍然会被破坏。最好是从其他地方设置ping监视器,这可以使您的网站保持活力。
答案 3 :(得分:1)
您无法在ASP.NET中可靠地运行计时器。如果没有请求进入,IIS可以关闭应用程序,并且在下一个请求到达之前它不会启动。
为什么你认为你需要一个计时器?在大多数Web应用程序中,根本不需要进行定期更新,除非它们依赖于外部源。
如果您只是在应用程序内部移动数据,实际的交易不必以确切的间隔发生,您只需要计算结果发生时的结果。每当请求进入时,您都会计算自上次请求以来发生的事务数量,并执行它们以赶上当前状态。
如果您的事务依赖于外部源,以便它们实际上必须在特定时间运行,那么您根本无法单独使用ASP.NET。您需要一个在IIS外部运行的应用程序,例如由Windows调度程序定期启动。
答案 4 :(得分:0)
您可以尝试使用system.threading.timer
http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx