考虑这段代码......
using System.Threading;
//...
Timer someWork = new Timer(
delegate(object state) {
//Do some work here...
},
null, 0, 60000);
HttpContext.Current.Application["SomeWorkItem"] = someWork;
这可能有危险吗?在应用程序中缓存计时器以在站点运行时在后台执行某些工作似乎是安全的,但我想知道是否有人有这方面的经验。
我确信编写一个在后台运行的服务肯定会好得多,但有时这并不总是一个选择。这是另类吗?
答案 0 :(得分:3)
这个问题是你无法保证这个过程仍然存在。 IIS会在感觉到的时候基本上回收这个过程,因此你冒着不执行它的风险。
如果您需要完成此项工作,则需要将其编码为Web调用,或者在服务器后台运行服务。
答案 1 :(得分:3)
这通常是一个坏主意,因为System.Threading.Timer使用ThreadPool中的线程,与ASP.Net相同。
如果您的计时器委托阻止或停止的原因,计时器将在超时期限之后开始一个新线程,该线程将进入可用于ASP.net的线程。
如果他们都开始阻止,实际上你将无法再提供任何网络请求(可能是一件坏事)
答案 2 :(得分:1)
这很危险,因为有时候工作进程被回收或者AppDomain崩溃并且工作项被杀死而你可能希望它恢复它正在做的事情,这可能是不可能的。
如果您可以将该工作项输出到服务中,则Windows服务可能没问题。如果工作需要HttpContext,虽然您可能希望让Windows服务调用Web服务来定期执行调用,但这可能有效但可能并不理想。
答案 3 :(得分:0)
这是有道理的,但只是为了好玩,如果网站关闭后工作不需要运行怎么办?如果它与Application_Start事件相关联,并且只需要在人们浏览网站时运行,那么此时的风险是什么?
很好的答案,我只是对内部如何运作感到好奇。
答案 4 :(得分:0)
我建议您设置计划任务以在您的网站上运行网页。我通常将计划任务指向.vbs文件,其中包含以下内容:
On Error Resume Next Dim objRequest Dim URL Set objRequest = CreateObject("Microsoft.XMLHTTP") URL = "http://www.mywebsite.com/cron/pagetorun.ashx" objRequest.open "POST", URL , false objRequest.Send Set objRequest = Nothing
答案 5 :(得分:0)
Omar Al Zabir在此目的上有一篇关于使用缓存项回调的优秀文章。