在Asp.net中重复出现计时器

时间:2010-06-22 15:40:26

标签: asp.net httphandler

我正在尝试实现一个重复发生的计时器功能asp.net。我无法创建Windows服务,因为我在共享环境中托管该站点,因此无权访问。

我已经阅读了各种方法来实现这一点,每个方法都有自己的优点/缺点。 cache object approach似乎很有希望,但确实看起来像是黑客。

我一直在尝试实现一个httphandler,它将启动一个System.Threading.Timer对象来循环每一分钟并做一些工作。可能排队其他工作项目。

这是我到目前为止所做的:

public class Scheduler : IHttpHandler
{
    protected static TimerCallback tcb = null;
    protected static Timer timer = null;

    static Scheduler()
    {

        tcb = new TimerCallback(DoWork);
        timer = new Timer(tcb, null, TimeSpan.Zero, new TimeSpan(0, 0, 1, 0));
    }

    private static void DoWork(Object stateInfo)
    {
    }

    public void ProcessRequest(HttpContext context)
    {

    }

    public bool IsReusable
    {
        get { return false; }
    }

}

我读了here,你需要注意当appDomain卸载时计时器没有被处理掉。他确实暗示如果你调用我不是的本机代码只是一个问题。我无法弄清楚如何绑定到application_end事件来处理处理程序中的计时器。

我的问题是,上述方法是否偏离了标志?有一个更好的方法吗?抛弃静态变量并将计时器存储在应用程序状态会更有意义吗?

抱歉,我需要知情的意见。我觉得自己好好转圈。

谢谢,

1 个答案:

答案 0 :(得分:1)

这是一个完整的黑客,希望我不要投票! - 但你可以开发一个组件,它是你的web部署的一部分,它向同一站点上的处理程序发出Http请求 - 这样(我猜)你的应用程序可以自己调用以确保它没有被卸载。看到WebClient类 - 抱歉不确定哪个命名空间不在我的脑海中。

如果你这样做,你需要考虑如果它因任何原因被取消,它将如何重新启动;如果你的网络应用程序可以保持很长一段时间,我不确定你是否会遇到任何奇怪的行为。