C#定时器间歇性停止

时间:2011-07-11 14:26:56

标签: c# asp.net timer code-behind

任何人都可以建议为什么C#计时器(在代码隐藏类中创建)会在没有被告知的情况下停止?

我的计时器在页面加载时启动,然后在单击按钮时停止。我不需要点击它的按钮有时会停止。据我所知,IIS没有重新启动,也没有抛出任何错误。

这让我很困惑......

感谢。

    // This gets called on page_load
    private void checkTimer()
    {
        if (!parentTimer.Enabled) // If parent timer is not enabled then it is probably the start of a new day (after a night time server backup which kills timers)
        {
            parentTimer.Interval = 60000; // One minute
            parentTimer.Elapsed += new ElapsedEventHandler(parentTimer_Elapsed); // Define what happens when elapsed
            parentTimer.AutoReset = true; // Set timer to repeat
            parentTimer.Enabled = true; // Start the timer
        }
    }

    protected void btnCancel_Click(object sender, System.EventArgs e)
    {
        parentTimer.Stop();
        ...etc...
    }

注意:我没有在其经过的方法中更改ParentTimer。

基本上,ParentTimer管理ChildTimers列表。如果ParentTimer过去,它会检查一个或多个ChildTimers是否已经过去,如果是,则有一个事件,如果没有,则重置ChildTimer并继续。

2 个答案:

答案 0 :(得分:2)

我怀疑是因为页面的工作进程在请求结束时停止。

您可以尝试增加请求超时,但更好的问题是,您能解释为什么要尝试这样做吗?你试图解决的问题是什么?

请记住,无论ASP.Net为了让您感觉舒适(会话状态,视图状态等)而放弃代码的所有漏洞,Web请求都是无状态的,应该被视为逻辑的独特传递,它不是就像一个Windows应用程序,其中void Main(...)函数中的代码后台线程一直在运行。

答案 1 :(得分:1)

计时器与创建它的线程相关联,在ASP.net的情况下,由于使用工作线程和线程池,处理给定用户发出的每个页面请求的线程会频繁更改。

在页面级别使用计时器根本不起作用;您需要跟踪会话级别(与特定用户相关联)的状态作为起点。

事实上,我根本不会在Web应用程序中使用计时器,因为它们的执行无法保证。

如果你使用它来运行后台任务 - 考虑在Application_Start或类似的事情中启动你自己的工作线程。当应用程序池回收时,该线程将被终止。您还应该看一下手动关闭线程,同时关闭应用程序。

小心这一点,但是,这个线程不能假设它总是只运行 - 由于IIS重叠回收,当一个新的启动时,旧的一个仍然可以运行旧的AppDomain。