2010-06-22 28 views
0

我想实现一个重复定时器函数asp.net。我无法创建Windows服务,因为我在共享环境中托管网站,因此无法访问。Asp.net中的重复计时器

我已经阅读了各种各样的方法来实现它们各自的优点/缺点。 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事件来处理处理程序中的计时器。

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

对不起,我需要知情的意见。我感觉自己在圈子里四处走动。

谢谢,

+0

你究竟在做什么?你的HttpHanlder只会在被叫时触发,所以我认为它不会有太大的帮助。你可以在你控制的那个叫HttpHandler的盒子上有一个服务 - 但这是另一个黑客。您是否问过ISP您是否可以安装服务?如果你问得好,他们*可能会让你。 – 2010-06-25 07:33:44

回答

1

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

如果你这样做,你需要考虑它是如何因任何原因被重新启动的;而且我不确定如果您有一个长时间保持的Web应用程序,您是否会遇到任何奇怪的行为。