任何人都可以建议为什么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并继续。
答案 0 :(得分:2)
我怀疑是因为页面的工作进程在请求结束时停止。
您可以尝试增加请求超时,但更好的问题是,您能解释为什么要尝试这样做吗?你试图解决的问题是什么?
请记住,无论ASP.Net为了让您感觉舒适(会话状态,视图状态等)而放弃代码的所有漏洞,Web请求都是无状态的,应该被视为逻辑的独特传递,它不是就像一个Windows应用程序,其中void Main(...)函数中的代码后台线程一直在运行。
答案 1 :(得分:1)
计时器与创建它的线程相关联,在ASP.net的情况下,由于使用工作线程和线程池,处理给定用户发出的每个页面请求的线程会频繁更改。
在页面级别使用计时器根本不起作用;您需要跟踪会话级别(与特定用户相关联)的状态作为起点。
事实上,我根本不会在Web应用程序中使用计时器,因为它们的执行无法保证。
如果你使用它来运行后台任务 - 考虑在Application_Start
或类似的事情中启动你自己的工作线程。当应用程序池回收时,该线程将被终止。您还应该看一下手动关闭线程,同时关闭应用程序。
小心这一点,但是,这个线程不能假设它总是只运行 - 由于IIS重叠回收,当一个新的启动时,旧的一个仍然可以运行旧的AppDomain。