我有一个页面,当某些操作出错时,我想启动计时器,等待30秒,停止计时器并重试操作。每次定时器启动时,我都需要通过更改某些标签的文本来通知用户。
我该怎么做?
答案 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);
}
样本输出: