如何在asp.net中设置计时器

时间:2009-01-03 14:58:47

标签: asp.net timer

我有一个页面,当某些操作出错时,我想启动计时器,等待30秒,停止计时器并重试操作。每次定时器启动时,我都需要通过更改某些标签的文本来通知用户。

我该怎么做?

3 个答案:

答案 0 :(得分:3)

如果我理解正确,我认为你应该使用客户端(javascript)计时器。您不能使用服务器端计时器。

当您检测到错误情况时,您会相应地更新标签并将其显示给用户。同时你调用一个客户端计时器,它将在30秒后回发。

E.g。将以下计时器代码放到您的页面上:

  <script>
    function StartTimer()
    {
      setTimeout('DoPostBack()', 30000); // call DoPostBack in 30 seconds
    }
    function DoPostBack()
    {
      __doPostBack(); // invoke the postback
    }
  </script>

如果出现错误情况,您必须确保启动客户端计时器:

if (error.Code == tooManyClientsErrorCode)
{
  // add some javascript that will call StartTimer() on the client
  ClientScript.RegisterClientScriptBlock(this.GetType(), "timer", "StartTimer();", true);
  //...
}

我希望这会有所帮助(代码未经过测试,因为我目前没有可用的Visual Studio)。

<强>更新

要“模拟”按钮单击,您必须将按钮的客户端ID传递给__doPostBack()方法,例如:

function DoPostBack()
{
  var buttonClientId = '<%= myButton.ClientID %>';
  __doPostBack(buttonClientId, ''); // simulate a button click
}

对于其他一些可能性,请参阅以下问题/答案:

答案 1 :(得分:1)

从客户端强制回发你可以直接调用__doPostBack方法

需要两个参数,EVENTTARGET和EVENTARGUMENT;因为你在正常的asp.net循环之外进行调用,你需要在你的页面加载事件(或init,你的选择)上检查IsPostBack - 如果它是一个回发,那么你需要查看那两个被推出的参数作为表单元素(Request.Form [“__ EVENTTARGET”])。检查它们的值以查看回发是来自您的呼叫还是来自其他控件之一,如果这些值与您从客户端传递的内容匹配,则更改为标签测试

答案 2 :(得分:0)

执行此操作的两种方法,第一种方法,如果需要在同一线程上调用其他函数,则更好。在aspx页面上添加一个ScriptManager和一个Timer,您可以从工具箱中拖放或直接输入代码。必须在asp:Timer之前声明ScriptManager。每个间隔后都会触发OnTick。

    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:Timer ID="Timer1" runat="server" Interval="4000" OnTick="Timer1_Tick">
    </asp:Timer>

在后面的代码中(在这种情况下为c#):

    protected void Timer1_Tick(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("tick tock");
    }

如果您需要函数在同一线程上触发,第二种方法就不好了。 您可以使用C#在ASP.net中执行计时器,以下代码每2秒触发一次该函数。 在(.cs)文件后面的代码中:

    // timer variable
    private static System.Timers.Timer aTimer;

    protected void Page_Load(object sender, EventArgs e)
    {
        // Create a timer and set a two second interval.
        aTimer = new System.Timers.Timer();
        aTimer.Interval = 2000;

        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;

        // Have the timer fire repeated events (true is the default)
        aTimer.AutoReset = true;

        // Start the timer
        aTimer.Enabled = true;
    }

然后使用以下格式制作要调用的函数:

//Doesn't need to be static if calling other non static functions

    private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
    }

样本输出:

Output