System.Timers.Timer每5分钟不工作一次

时间:2010-11-16 14:19:39

标签: c# asp.net

我有一个必须每5分钟运行一次的方法,以便在gridview中显示最新数据。

我正在尝试使用System.Timers.Timer,以下是我的代码:

 protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            lblError.Text = "";

            t = new System.Timers.Timer(300000);//every 5min = 300000
            t.Enabled = true;
            t.Elapsed += new ElapsedEventHandler(t_Elapsed);

            if (!Page.IsPostBack)
            {
                //t = new System.Timers.Timer(300000);//every 5min = 300000
                //t.Enabled = true;
                //t.Elapsed += new ElapsedEventHandler(t_Elapsed);

                floor = ddFloors.SelectedValue.ToString();
                GenerateStatus();
            }
        }
        catch (Exception ex)
        {
            lblError.Text = ex.Message; 
        }
    }


  void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        try
        {
            //Response.Redirect("Home.aspx");
            floor = ddFloors.SelectedValue.ToString();
            GenerateStatus();
        }
        catch (Exception ex)
        {
            lblError.Text = ex.Message;
        }
    }

问题是5分钟后它不会t_Elapsed。请注意,这应该始终保持完成,而不仅仅是一次。任何帮助吗?

4 个答案:

答案 0 :(得分:2)

将您的计时器的AutoReset成员设置为true

你可以read more about AutoReset on MSDN

实际上trueAutoReset的默认值,可能您的问题是您的响应已发送且您的计时器超出范围。

答案 1 :(得分:1)

您需要更好地了解Web应用程序的客户端/服务器模型。当此事件触发时,页面早已呈现并发送到浏览器 如果你想做这样的事情,你将不得不使用javascript在客户端上做。像jQuery timers这样的jQuery插件和使用AJAX回调服务器的组合可以帮助你实现你想要的目标。

答案 2 :(得分:1)

您的计时器是一个局部变量,因此它超出了范围。

此外,这是一个ASP.NET页面,在服务器上创建Timers并不是一个好主意。

常规事件是否只需要在服务器上发生,或者您是否希望它在用户浏览器中执行某些操作?

如果您希望在服务器上发生重复事件,请参阅此博客文章,了解如何在ASP.NET中安排重复事件:

http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

如果您希望定期事件在用户浏览器中产生某些影响,则需要使用Javascript和/或JQuery从客户端而不是在服务器上触发事件

答案 3 :(得分:0)

你需要的是在客户端刷新,服务器功能只在页面加载时运行一次,使用meta或settimeout