[英]How to change label text every x seconds with a timer
我想每5000毫秒更新一次表单中标签的文本,我一直在尝试使用计时器,但是它不起作用,我也不知道为什么。 这是我正在使用的代码:
private void Form1_Load(object sender, EventArgs e)
{
openRequests();
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 20000;
aTimer.Enabled = true;
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
codeComboBox.Items.Clear();
try
{
connectionDB.Open();
String query = "";
query = "SELECT GMKEY0 FROM SAM_FILNAS.EGESM1F0 WHERE GMSTX0 = '0' OR GMSTX0 = 'P' ";
daMAT = new OleDbDataAdapter(query, connectionDB);
dsMAT = new System.Data.DataSet();
daMAT.Fill(dsMAT, "sam_filnas.EGESM1F0 ");
foreach (System.Data.DataTable t in dsMAT.Tables)
{
foreach (System.Data.DataRow r in t.Rows)
{
codeComboBox.Items.Add(r["GMKEY0"]);
}
}
}
catch (Exception exc)
{
MessageBox.Show("non riesco a scaricare le richieste di manutenzione aperte");
}
label7.Text = "CI SONO " + codeComboBox.Items.Count.ToString() + " RICHIESTE DI MANUTENZIONE";
connectionDB.Close();
//updateTimer.Start();
resertAllTheControls();
}
计时器启动,每隔5秒调用一次onTimeEvent
方法,但是由于某种原因,似乎该方法的执行停止在codeComboBox.Items.Clear();
请给我解释为什么会这样。
不要使用System.Timers.Timer
。 请改用System.Windows.Forms.Timer
。
Elapsed
在ThreadPool线程上执行,这意味着在尝试更改UI上的内容时必须使用Invoke
,因为UI具有自己的线程。
System.Windows.Forms.Timer
的Tick
事件发生在UI线程上,因此不需要任何特殊代码即可在其事件处理程序中使用UI元素。
该System.Timers.Timer
使用System.Threading.Timer
内部。 从System.Threading.Timer
文档页面的“ 备注”段落中:
System.Threading.Timer
是一个简单,轻便的计时器,它使用回调方法,并由线程池线程提供服务。
不建议将其与Windows窗体一起使用,因为其回调不会在用户界面线程上发生。
System.Windows.Forms.Timer
是与Windows Forms一起使用的更好选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.