【发布时间】:2021-02-15 07:41:35
【问题描述】:
应该直截了当的东西不在这里,尽管阅读了很多,但我还是找不到方法。
我有一个执行耗时功能的按钮。因此,单击按钮应在标签中以 500 毫秒的间隔显示经过的时间(以毫秒为单位)。当达到预期的结果时,我希望计时器停止。 我不仅需要标签中的最后时间(消耗的总时间),而且标签应该动态显示经过的时间。我的代码是:
private void btnHistory_Click(object sender, EventArgs e)
{
Class1 c = new Class1();
c.StartClock(ref label12);
Utility.PopulateHistory(dgvRecords_history, _util); //time consuming function
c.StopClock();
}
我在Class1 中写道:
internal void StartClock(ref Label l)
{
Timer t = new Timer();
t.Interval = 500;
t.Enabled = true;
t.Tag = l;
t.Tick += new EventHandler(t_Tick);
t.Start();
}
int i;
bool stop;
void t_Tick(object sender, EventArgs e)
{
if (stop)
{
((Timer)sender).Stop();
return;
}
((Label)((Timer)sender).Tag).Text = (++i).ToString();
}
internal void StopClock()
{
i = 0;
stop = true;
}
发生的情况是,t_Tick 事件仅在按钮事件下的完整代码被触发后才会触发。也就是说,tick 事件在通过 StopClock 函数后被触发!我不知道为什么它应该是那样的!
基本上2个问题:
如何以正确的方式满足我的要求来处理这些问题?我知道我应该使用其他内置类来评估性能,但这仅用于显示目的。为此,理想的方法是什么?
为什么我的代码不起作用?
编辑:我在这里使用了System.Windows.Forms Timer,但结果与System.Timers Timer没有任何不同
【问题讨论】:
-
您确定 t_Tick 只被触发一次吗?你真的调试了吗?
-
@Shai,从 StopClock 功能退出后,它不会连续不断地发射。但是由于我已经给出了一个 if 子句来停止计时器,所以它很容易停止计时器,因此只滴答一次。希望你能得到我