我正在尝试实现一个重复发生的计时器功能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事件来处理处理程序中的计时器。
我的问题是,上述方法是否偏离了标志?有一个更好的方法吗?抛弃静态变量并将计时器存储在应用程序状态会更有意义吗?
抱歉,我需要知情的意见。我觉得自己好好转圈。
谢谢,
答案 0 :(得分:1)
这是一个完整的黑客,希望我不要投票! - 但你可以开发一个组件,它是你的web部署的一部分,它向同一站点上的处理程序发出Http请求 - 这样(我猜)你的应用程序可以自己调用以确保它没有被卸载。看到WebClient类 - 抱歉不确定哪个命名空间不在我的脑海中。
如果你这样做,你需要考虑如果它因任何原因被取消,它将如何重新启动;如果你的网络应用程序可以保持很长一段时间,我不确定你是否会遇到任何奇怪的行为。