C# 计时器间歇停止

C# 计时器间歇停止,c#,asp.net,timer,code-behind,C#,Asp.net,Timer,Code Behind,有人能提出为什么C#timer(在代码隐藏类中创建)会停止而不被告知的原因吗 我的计时器在页面加载时启动,然后在单击按钮时停止。我不需要点击按钮,它有时会停止。据我所知,IIS没有重新启动,也没有抛出任何错误 这让我有点困惑 谢谢 // This gets called on page_load private void checkTimer() { if (!parentTimer.Enabled) // If parent timer is not e

有人能提出为什么C#timer(在代码隐藏类中创建)会停止而不被告知的原因吗

我的计时器在页面加载时启动,然后在单击按钮时停止。我不需要点击按钮,它有时会停止。据我所知,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管理子计时器列表。如果ParentTimer过期,它会检查是否有一个或多个ChildTimer过期,如果是,则会发生事件,如果不是,则会重置ChildTimer并继续执行。

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

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


请记住,无论ASP.Net在您的代码中添加了多少让您感到舒适的漏洞(会话状态、视图状态等),web请求都是无状态的,应该被视为一种独特的逻辑传递,它不像windows应用程序那样,在空主程序中有一个后台代码线程(…)函数一直在运行。

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

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


请记住,无论ASP.Net在您的代码中添加了多少让您感到舒适的漏洞(会话状态、视图状态等),web请求都是无状态的,应该被视为一种独特的逻辑传递,它不像windows应用程序那样,在空主程序中有一个后台代码线程(…)函数一直在运行。

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

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

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

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


但是,请注意,此线程不能假定它始终是唯一运行的线程-由于IIS重叠回收,当一个新的应用程序启动时,旧的应用程序可能仍在旧的AppDomain中运行。

一个计时器绑定到创建它的线程,在ASP.net的情况下,处理给定用户发出的每个页面请求的线程将因使用工作线程和线程池而频繁更改

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

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

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


但是,请注意,此线程不能假定它始终是唯一运行的线程-由于IIS重叠回收,当新线程启动时,旧线程可能仍在旧AppDomain中运行。

您可以提供一些示例代码吗?计时器存储在何处?如果你不把它注册到某个静态可验证文件,你的页面内存可能会被调出,计时器可能会被破坏。单击按钮后,将创建一个新页面,并使用一个新计时器显示“奇怪”时间。使用数据库来跟踪点击速度或一些共享数据结构。您能提供一些示例代码吗?计时器存储在哪里?如果你不把它注册到某个静态可验证文件,你的页面内存可能会被调出,计时器可能会被破坏。单击按钮后,将创建一个新页面,并使用一个新计时器显示“奇怪”时间。使用数据库跟踪点击速度或某些共享数据结构。那么,如何管理需要在后台持续运行的任务?是否最好并行运行控制台应用程序,并在每次ASP站点需要做某件事时戳控制台应用程序?有几种解决方案,控制台应用程序可能可以工作,但windows服务可能更好。另一种选择是将工作封装到一个不同的包中,并将其作为一个新线程启动;它将一直运行到完成。那么,您将如何管理需要在后台持续运行的任务?是否最好并行运行控制台应用程序,并在每次ASP站点需要做某件事时戳控制台应用程序?有几种解决方案,控制台应用程序可能可以工作,但windows服务可能更好。另一种选择是将工作封装到一个不同的包中,并将其作为一个新线程启动;它将一直运行到完成为止。