正如其他答案中已经提到的那样, System.Timers.Timer 在非 GUI 线程上触发。这将不允许您访问 GUI 元素并会引发跨线程异常。您可以使用 MethodInvoker 访问 tm_Elapsed
事件中的 GUI 元素。由于您在 Forms 中有 Timer 并希望访问 GUI 元素,因此其他 Timer 类最适合您,即System.Windows.Forms.Timer。
实现一个以用户定义的时间间隔引发事件的计时器。此计时器针对在 Windows 窗体应用程序中的使用进行了优化,并且必须在窗口中使用。
protected void Page_Load(object sender, EventArgs e)
{
System.Windows.Forms.Timer tm = new System.Windows.Forms.Timer();
tm.Tick += tm_Tick;
tm.Interval = 1000;
tm.Start();
}
void tm_Tick(object sender, EventArgs e)
{
int lbl = Convert.ToInt32(label1.Text);
label1.Text = (lbl + 1).ToString();
}
根据 OP 的评论进行编辑,他是在网页中执行此操作,而不是像加载事件名称所暗示的那样赢得表单。
如果您不需要来自服务器的任何内容,则可以使用 javascript。如果您想更新 html 控件并且需要从服务器执行,那么您可以使用asp:Timer
html (.aspx)
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:Timer runat="server" id="UpdateTimer" interval="5000" ontick="UpdateTimer_Tick" />
<asp:UpdatePanel runat="server" id="TimedPanel" updatemode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger controlid="UpdateTimer" eventname="Tick" />
</Triggers>
<ContentTemplate>
<asp:Label id="Label1" runat="server" Text="1" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
背后的代码
protected void UpdateTimer_Tick(object sender, EventArgs e)
{
Label1.Text = int.Parse(Label1.Text) + 1;
}