1

考虑这段代码...

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

HttpContext.Current.Application["SomeWorkItem"] = someWork;

这会很危险吗?在应用程序中缓存一个计时器以在您的网站运行时在后台执行一些工作似乎是安全的,但我想知道是否有人对此有一些经验。

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

4

6 回答 6

3

这样做的问题是您不能保证该过程仍然存在。IIS 基本上会在需要时回收该过程,因此您冒着不执行该过程的风险。

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

于 2008-09-22T20:19:54.460 回答
3

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

如果由于任何原因您的计时器委托阻塞或停止,计时器将在超时期限后开始一个新线程,这会占用 ASP.net 可用的线程。

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

于 2008-09-22T20:26:49.950 回答
1

这将是危险的,因为有时工作进程被回收或 AppDomain 崩溃并且工作项被杀死,您可能希望它恢复它正在做的事情,这可能是不可能的。

如果您可以将该工作项放入服务中,则 Windows 服务可能是可以的。如果工作需要 HttpContext,但您可能希望让 Windows 服务调用 Web 服务来定期执行调用,这可能会起作用,但可能并不理想。

于 2008-09-22T20:20:58.077 回答
0

这是有道理的,但只是为了好玩,如果网站关闭时不需要运行工作怎么办?如果它与 Application_Start 事件相关,并且只需要在人们浏览站点时运行,那么此时的风险是什么?

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

于 2008-09-22T20:24:11.173 回答
0

我建议您设置一个计划任务来在您的网站上运行一个页面。我通常将计划任务指向一个 .vbs 文件,其中包含以下内容:

出错时继续下一步
暗淡 objRequest
昏暗的网址

设置 objRequest = CreateObject("Microsoft.XMLHTTP")
URL = "http://www.mywebsite.com/cron/pagetorun.ashx"

objRequest.open "POST", URL , false

objRequest.Send

设置 objRequest = 无
于 2008-09-22T20:24:59.847 回答
0

Omar Al Zabir 有一篇关于为此目的使用缓存项回调的优秀帖子。

http://www.codeproject.com/KB/aspnet/ASPNETService.aspx?fid=229682&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=1334820

于 2008-10-21T19:50:44.813 回答