ASP.NET和计时器

ASP.NET和计时器,asp.net,multithreading,timer,Asp.net,Multithreading,Timer,考虑一下这个代码 using System.Threading; //... Timer someWork = new Timer( delegate(object state) { //Do some work here... }, null, 0, 60000); HttpContext.Current.Application["SomeWorkItem"] = someWork; 这会很危险吗?在应用程序中缓存一个计时器,以便在站点运行时在后台执

考虑一下这个代码

using System.Threading;
//...
Timer someWork = new Timer(
    delegate(object state) {
        //Do some work here...
    },
    null, 0, 60000);

HttpContext.Current.Application["SomeWorkItem"] = someWork;
这会很危险吗?在应用程序中缓存一个计时器,以便在站点运行时在后台执行一些工作,这似乎是安全的,但我想知道是否有人对此有一些经验


我确信,编写一个在后台运行的服务肯定会更好,但有时这并不总是一个选项。这是一种替代方案吗?

问题在于,您不能保证进程仍然有效。IIS基本上会在需要时回收该进程,因此您可能会面临无法执行该进程的风险


如果您需要完成这项工作,那么您需要将其编码到web调用中,或者让服务在服务器的后台运行。

问题在于您无法保证进程仍然处于活动状态。IIS基本上会在需要时回收该进程,因此您可能会面临无法执行该进程的风险


如果需要完成此工作,则需要将其编码到web调用中,或者让服务在服务器后台运行。

这将是危险的,因为有时工作进程会被回收,或者AppDomain崩溃,工作项被终止,您可能希望它恢复正在执行的操作,这可能是不可能的


如果可以将该工作项导出到服务中,则Windows服务可能是正常的。如果工作需要HttpContext,但您可能希望让windows服务调用Web服务来定期执行调用,尽管可能不理想。

这将是危险的,因为有时工作进程会被回收,或者AppDomain崩溃,工作项被终止,您可能希望它恢复它在做什么,这可能是不可能的


如果可以将该工作项导出到服务中,则Windows服务可能是正常的。如果工作需要HttpContext,但您可能希望让windows服务调用Web服务来定期执行调用,虽然可能不理想。

这很有意义,但只是为了好玩,如果站点关闭时工作不需要运行该怎么办?如果它与应用程序启动事件关联,并且只需要在用户浏览网站时运行,那么此时的风险是什么


回答得好,我只是对它内部的工作原理有点好奇。

这是有道理的,但只是为了好玩,如果网站关闭后不需要运行该工作怎么办?如果它与应用程序启动事件关联,并且只需要在用户浏览网站时运行,那么此时的风险是什么


回答得好,我只是想了解一下内部的工作原理。

我建议您设置一个计划任务,以便在站点上运行页面。我通常将计划任务指向.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 出错时继续下一步 模糊对象请求 暗URL 设置objRequest=CreateObject(“Microsoft.XMLHTTP”) URL=”http://www.mywebsite.com/cron/pagetorun.ashx" objRequest.open“POST”,URL,false objRequest.Send Set objRequest=Nothing
我建议您设置一个计划任务,以便在站点上运行页面。我通常将计划任务指向.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 出错时继续下一步 模糊对象请求 暗URL 设置objRequest=CreateObject(“Microsoft.XMLHTTP”) URL=”http://www.mywebsite.com/cron/pagetorun.ashx" objRequest.open“POST”,URL,false objRequest.Send Set objRequest=Nothing
这通常不是一个好主意,因为System.Threading.Timer使用线程池中的线程,与ASP.Net相同

如果您的计时器委托由于任何原因而阻塞或停止,计时器将在超时时间后简单地开始一个新线程,这将侵蚀ASP.net可用的线程


如果它们都开始阻塞,实际上您将无法再处理任何web请求(可能是一件坏事)

这通常是个坏主意,因为System.Threading.Timer使用线程池中的线程,与ASP.Net相同

如果您的计时器委托由于任何原因而阻塞或停止,计时器将在超时时间后简单地开始一个新线程,这将侵蚀ASP.net可用的线程


如果它们都开始阻塞,实际上您将无法处理更多的web请求(可能是一件坏事)

奥马尔·扎比尔(Omar Al-Zabir)在使用缓存项回调实现这一目的方面发表了一篇出色的文章


奥马尔·扎比尔(Omar Al-Zabir)在为此目的使用缓存项回调方面发表了一篇精彩的文章